c++基础/类和对象

news2024/7/6 17:56:24

c++基础

2.1名字空间

namespace 防止命名冲突

说明:名字空间可以在全局作用域或其他作用域(另一个名字空间)内部定义,但不能在函数或类的内部定义。

使用:

#include<iostream>
using namespace std; //std中包含关键字,cin,cout等
namespace spaceA{
    int x;
    int y;
}
int main()
{
    spaceA::x = 8;  //1.名字空间名称::局部内容名称
    cout<<spaceA::x<<endl;
    spaceA::y = 9;  
    cout<<spaceA::y<<endl;
    
    // 2.using namespace 名字空间名称
    using namespace spaceA;
    x = 8;
    y = 9;
    cout<<x<<y;
    // 3.using spaceB
    using spaceA::x;
    x=4;
    cout<<x;
    return 0;
}

2.2数据类型

基本数据类型:整型,实型,字符型,布尔型,无值型

非基本数据类型:复合数据类型,构造数据类型

 2.3 new和delete

指针变量的定义:

注意:ip 是指针变量, *ip是解引用(不要和int *ip 弄混)

int num ;
int *ip = &num; //定义一个整型指针变量
*ip = 4;  //解引用
// 解引用操作仅适用于那些确实指向了某个对象的有效指针

 为什么指针变量在定义时要说明其类型?

        指针变量保存的是地址, 如一个整型指针变量是4个字节,要访问内存时,要将4个字节全部读出来时才有意义。

new        &       delete

        new 内存分配

        delete 释放new分配的存储空间

#include<iostream>
using namespace std;
int main(){
    int *p;
    p = new int; //申请一个整型空间
    *p = 7;
    cout<<*p<<endl;
    delete p;   

    return 0;
}

注意:定义使用指针变量的方法

2.4引用

 2.5函数

 2.6参数传递

1.传值参数:

        当初始化一个非引用类型的变量时,初始值被拷贝给变量,此时,变量的改动不会影响初始值。

        当执行指针拷贝操作时,拷贝的是指针的值。拷贝之后,两个指针是不同的指针。

2.传引用参数

        通过使用引用形参,允许函数改变一个或多个实参的值。引用形参绑定初始化它的对象

2.7内联函数 

 调用函数一般比求等价表达式的值要慢一些。在大多数机器上,一次函数调用包含这一系类的工作: 调用前要保存寄存器,并在返回时恢复;可能需要拷贝实参;程序转换到另一个位置继续执行。

2.8重载函数

 2.9异常处理

 try & throw & catch ....

 类与对象

3.1类

类是具有相同属性和方法的一类对象集合的抽象

定义类就是对问题抽象和封装的过程。

类的定义:

 

  关键:在类体外定义成员函数

3.2对象

对象是类的实例或实体

 对象成员的访问:

point *point_p1;
point_p1 = &p1;
//定义一个指针,并且赋予指针意义,指向p1的地址
point_p1->set(1,2); //使用指针访问成员变量
p1.show();
(*point_p1).set(2,3); //使用对象访问成员
(&p1)->show()

 3.3类的界面和实现

point.h & point.cpp 分开实现

//point.cpp
#include<iostream>
#include "point.h"
using namespace std;
void point::set1(int a,int b)
{
    x = a;
    y = b;
}
void point::show()
{
    cout<<x<<y<<endl;
}
//point.h
class point
{
private:
    int x,y;
public:
    void set1(int a,int b);
    void show();
};
//main.cpp
#include<iostream>
#include "point.h"
using namespace std;
int main(){
    point p1;
    p1.set1(1,1);
    p1.show();
    return 0;
}

3.3.1构造函数

构造函数是一种特殊的成员函数,对象的创建初始化由它来完成。

 1.构造函数不能是私有的;

2.构造函数可以重载,可以带一个参数,也可以不带参数。

3.3.2成员初始化列表

 冒号后面就是成员初始化表:可以使用引用&,

 3.3.3具有默认参数的构造函数

 3.3.4析构函数(重点)

特点:释放对象,回收空间

自动被调用

析构函数自动被调用 

 3.3.5拷贝构造函数

定义:

 特点:

 3.3.6浅拷贝和深拷贝

 

  1.  能满足已知对象去初始化未知对象,用默认的拷贝构造函数可以实现,浅拷贝
  2.  如果一个类中含有指针类型的变量,浅拷贝会出现错误 ,需要自己写拷贝构造函数。这种拷贝就是深拷贝。 
#include<iostream>
#include<cstring>
using namespace std;
class String
{
    char *buf;  //用来存放字符串的
    int length;//表示字符串的长度
public:
    String()    //不带参数的构造函数,创建一个空串
    {
        length = 0;    //串长为0
        buf = new char; 
        buf[0] = '\0';//字符串的结束符
    }
    String(char *s)   //用字符串初始化
    {
        length=strlen(s);
        buf = new char[length+1];//开辟空间,对一个空间放'\0'字符串的结束符
        strcpy(buf,s);
    }
    //拷贝构造函数
    String(const String &s)
    {
        
        length = s.length;
        //buf = s.buf; 错误的方法
        buf = new char[length+1];
        strcpy(buf,s.buf);
        cout<<"我是默认拷贝构造函数,深拷贝"<<endl;
    }
    ~String()      //析构函数,回收空间
    {
        delete[] buf;
    }
    void show()
    {
        cout<<buf<<endl;
    }
};
int main()
{
    String s1((char *)"helloworld!"); //需要强制类型转换一下
    s1.show();
    String s2 = s1; //拷贝一下
    s2.show();
    return 0;
}

拷贝成功

 3.4this指针

用途:

①区分成员和非成员

 上面的方式是不对的,正确的赋值方式

 ② 类的方法需要返回当前对象的引用

   3.5向函数传递对象 

                                                              

3.6类的静态成员                                                        

 

 

#include<iostream>
using namespace std;
class student{
    public:
        static int count;
        static double total;
        student(double score)
        {
            this->score = score;
            count++;
            total+=score;
        }
        static double getAverage(){
            return total/count;
        }
    private:
        double score;
};
int student::count = 0;
double student::total = 0;  //初始化成员

int main()
{
    student s1(70),s2(90);
    cout<<s1.getAverage()<<endl;  //通过对象去访问
    cout<<student::getAverage()<<endl; // 通过类名访问,static 类里面的静态全局变量
    return 0;
}

3.7类的友元

 

//一个类的成员函数作为另一个类的友元使用
#include<iostream>
using namespace std;
class girl; //声明一下
class boy
{
    string name;
    public:
        boy(string nm)
        {
            name = nm;
        }
        void introduce()
        {
            cout<<"i am "<<name<<endl;
        }
        void introducefriend(girl &x);  
};
class girl
{
    string name;
    public:
    girl(string nm)
    {
        name = nm;
    }
    void introduce()
    {
        cout<<"i am"<<name<<endl;
    }
    friend void boy::introducefriend(girl &x);
    //声明boy的成员函数introducefriend是girl的友元函数
};
void boy::introducefriend(girl &x)
{
    cout<<"she is "<<x.name<<endl;
}
int main()
{
    boy boy1("tom");
    girl girl1("alice");
    boy1.introduce();
    boy1.introducefriend(girl1);

    return 0;
}

3.8对象成员

一个类的对象是另一个类的数据成员

A的对象a是B的数据成员。

 3.9const

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/384509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C/C++ 数据结构】-八大排序之 冒泡排序快速排序

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【C/C数据结构与算法】 分享&#xff1a;那我便像你一样&#xff0c;永远躲在水面之下&#xff0c;面具之后&#xff01; ——《画江湖之不良人》 主要内容&#xff1a;八大排序选…

前端构建工具大盘点:gulp、webpack、vite、rollup、esbuild、snowpack、babel、parcel、swc、tsc

文章目录背景分类转译器打包器对比gulp VS webpackBundle vs Bundleless&#xff08;代表就是webpack VS vite&#xff09;其他比较个人理解总结官网背景 做前端也有好多年了&#xff0c;从最早的 jQuery 时代到现在的三大框架&#xff0c;这过程中用到了很多构建工具&#xf…

婴幼儿常见八大疾病及护理方法

在1岁之前&#xff0c;婴儿的体质还没有完全发育&#xff0c;很容易生病&#xff0c;大多数婴儿在1岁之后都会更好。今天&#xff0c;新的稀有婴儿育儿专家组织了一些婴儿最容易患的疾病和护理方法。1、新生儿黄疸宝宝出生后&#xff0c;你可能会注意到他的皮肤发黄。别担心&am…

Netty学习(三):Netty线程模型和代码示例

〇、前言网络编程的基本线程模型&#xff0c;详见&#xff1a;Netty学习&#xff08;二&#xff09;&#xff1a;线程模型一、工作原理简图Netty主要基于主从 Reactors 多线程模型&#xff08;如下图&#xff09; 做了一定的改进&#xff0c;其中主从Reactor 多线程模型有多个R…

11_MySQL数据处理(增删改)

1. 插入数据1.1 实际问题解决方式&#xff1a;使用 INSERT 语句向表中插入数据。1.2 方式1&#xff1a;使用VALUES使用这种语法一次只能向表中插入一条数据。情况1&#xff1a;为表的所有字段按默认顺序插入数据INSERT INTO 表名 VALUES (value1,value2,....);值列表中需要为表…

Windows安装Liberica JAVA8

在浏览器打开下载&#xff1a;Liberica JAVA。 点击链接"下载MSI"相对应的Microsoft Windows版本。 下载后完成后&#xff0c;验证的文件&#xff0c;通过比较其大小对你的驱动器和下载的页。 一个更加先进的方法来验证检验和在PowerShell&#xff1a; (Get-FileHas…

软件测试之测试环境--XAMPP

1. 测试环境 Linux下的环境搭建 LNMP: LinuxNginxMysqlphp项目 Windows下的环境搭建 WAMP: WindowsapacheMysqlphp项目 2. Xampp安装及使用 XAMPP包括Apache、MySQL、PHP、PERL&#xff0c;直接解压缩&#xff0c;没有复杂的安装过程&#xff0c;强烈推荐初学者使用。 到目前…

【C/C++基础知识点】输出n位斐波那契数列

目录 前言什么是斐波那契数列兔子的故事小知识点收尾前言 在软件行业已经有快十年,技术虽然一般般,但是足够应付额解决编程入门的相关问题! 都说十年磨一剑,积累到一定经验,是时候发挥自己的价值,给予入门的同行些许的帮助! 为什么要写收费专栏,其实原因很简单,时间就…

使用VNC远程连接Ubuntu - 内网穿透实现公网远程办公

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

PLSQL创建新用户并导入导出.dmp文件

一、登录管理员账号 用户名密码登录身份说明systemmanagerSYSDBA 或 NORMAL不能以 SYSOPER 登录&#xff0c;可作为默认的系统管理员syschange_on_installSYSDBA 或 SYSOPER不能以 NORMAL 登录&#xff0c;可作为默认的系统管理员scotttigerNORMAL普通用户aqadmaqadmSYSDBA 或…

目标检测论文阅读:RepPoints算法笔记

标题&#xff1a;RepPoints: Point Set Representation for Object Detection 会议&#xff1a;ICCV2019 论文地址&#xff1a;https://ieeexplore.ieee.org/document/9009032/ 官方代码&#xff1a;https://github.com/microsoft/RepPoints 作者单位&#xff1a;北京大学、清华…

Jetpack Compose 深入探索系列六:Compose runtime 高级用例

Compose runtime vs Compose UI 在深入讨论之前&#xff0c;非常重要的一点是要区分 Compose UI 和 Compose runtime。Compose UI 是 Android 的新 UI 工具包&#xff0c;具有 LayoutNodes 的树形结构&#xff0c;它们稍后在画布上绘制其内容。Compose runtime 提供底层机制和…

qsort快速排序的实现以及模拟实现qsort的功能(狠狠的拿捏)

当你为错过太阳而哭泣的时候&#xff0c;你也要再错过群星了。 --泰戈尔 目录 一.qsort快速排序的实现 二.模拟实现一个qsort功能的函数 一.qsort快速排序的实现 下面是 qsort() 函数的声明&#xff1a; void qsort(void *base, size_t nitems, size_t size, int (…

Java——电话号码的字母组合

题目链接 leetcode在线oj题——电话号码的字母组合 题目描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 题目示例…

高压功率放大器在压电驱动器的研究中的应用

实验名称&#xff1a;压电驱动器的电致振动特性研究研究方向&#xff1a;压电驱动器测试目的&#xff1a;旨在分析压电驱动器的电激励振动特性。以双晶压电悬臂梁为对象&#xff0c;基于能量法和热力学平衡方程推导了压电悬臂梁在电压激励下的强迫振动微分方程。利用自行搭建的…

Spring的核心基础——IOC与DI

文章目录一、Spring简介1 Spring介绍1.1 为什么要学1.2 学什么2 初识Spring2.1 Spring家族2.2 Spring发展史3 Spring体系结构3.1 Spring Framework系统架构图4 Spring核心概念问题导入4.1 核心概念二、IOC和DI入门1 IOC入门问题导入1.1 门案例思路分析1.2 实现步骤1.3 实现代码…

【计算机网络】HTTP

一、基础概念 请求和响应报文 客户端发送一个请求报文给服务器&#xff0c;服务器根据请求报文中的信息进行处理&#xff0c;并将处理结果放入响应报文中返回给客户端。 请求报文结构&#xff1a; 第一行是包含了请求方法、URL、协议版本&#xff1b;接下来的多行都是请求首…

大数据开发的工作内容与流程

大数据开发的工作内容与流程离线数据仓库开发实时流处理开发离线数据仓库开发 我们之后在做开发的时候&#xff0c;可能是选择某几个组件来使用。比如做数仓开发&#xff0c;可能就是用sqoop把数据抽到hdfs里&#xff0c;用spark或者mapreduce对这部分数据做一个清洗。 清洗的…

嵌入式开发--STM32H750VBT6开发中,新版本CubeMX的时钟问题,不能设置到最高速度480MHZ

嵌入式开发–STM32H750VBT6开发中&#xff0c;新版本CubeMX的时钟问题&#xff0c;不能设置到最高速度480MHZ 问题描述 之前开发的项目&#xff0c;开发环境是CubeMX6.6.1&#xff0c;H7系列的支持包版本是1.10.0。跑得没问题&#xff0c;最近需要对项目做修改&#xff0c;同…

vue学习(7)vuex的辅助函数封装(基于vue3)

简介&#xff1a; 封装了 mapState&#xff0c;mapGetters&#xff0c;mapActions&#xff0c;mapMutations&#xff0c;用更灵活的方式来使用vuex&#xff0c;主要使用的是vuex的createNamespacedHelpers方法&#xff0c;此方法是帮助重写以特定模块为主的辅助函数 createNa…