C++中类的6个默认函数
来源:互联网 发布:应届毕业生简历 知乎 编辑:程序博客网 时间:2024/06/03 09:33
类的6个默认的成员函数包括:
构造函数、析构函数、拷贝构造函数、赋值运算符重载函数、取地址操作符重载、const修饰的取地址操作符重载。
以下详细介绍前四个函数。
一、构造函数
构造函数:初始化对象的内存地址空间。
CGoods(){ _name=new char[1];}
实例化一个对象:1、分配对象内存空间
2、调用对象的构造函数
初始化:定义的同时赋值。
赋值:定义后,再赋值。
构造函数以类名为函数名,无返回值,可以重载可以带参数,在实例化一个对象的时候系统自动调用
如果用户自己没写构造函数,系统会调用系统默认的构造函数,系统默认的函数是public和inline的
二、析构函数
析构函数:释放对象的内存空间所占的资源(堆内存资源、文件描述符等)
~CGoods(){ delete []_name; _name=NULL;}
销毁一个对象
1、调用析构函数清理对象所占资源
2、清理内存空间
析构函数在类名前加上~运算符,无返回值,不带参数不可以重载,在return后由系统自动调用
注意:手动调用析构函数=调用一个普通函数,清理内存空间后系统还会自动调用一次析构函数,因此不建议手动调用析构函数。
后构造的函数先析构,先构造的函数后析构,与栈相似。
三、拷贝构造函数
拷贝构造函数:用一个已经存在的对象初始化相同类型的新对象时调用的函数
对象自己的成员,可以任意访问自己的其他任何访问限定成员方法和成员变量
CGoods(const CGoods &rhs) //必须传引用,为了防止实参和形参递归构造{ _name=new char[strlen(rhs._name)+1]; //防止浅拷贝 strcpy(_name,rhs._name); _amount=amount; _price=price;}
const的作用:
1、修饰形参不能改变
2、接收隐式产生的临时量
浅拷贝:多个对象指向同一个资源
int *p=new int(50);int *q=p;int q1=q;
深拷贝:多个对象拥有各自的资源
int *p=new int(50);int *q=new int();*q=*p;
四、赋值运算符重载函数
赋值运算符重载函数:用已存在的对象给另一个已存在的对象赋值
void Operator(const CGoods &rhs) //可以值传递但是引用效率高,因为没有开辟新栈帧{ if(this==&rhs) //防止自赋值 { return; } delete []_name; _name=new char[strlen(rhs._name)+1]; strcpy(_name,rhs._name); _amount=rhs._amount; _price=rhs._price;}
系统提供的赋值运算符重载函数:
1、多次释放同一资源
2、内存泄漏
自定义的赋值运算符重载函数:
1、防止自赋值
2、释放旧资源
3、开辟新资源进行初始化
系统提供的拷贝函数都是浅拷贝,如果发生浅拷贝,应该自己提供构造函数、拷贝构造函数、赋值运算符重载函数
编译器编译类分为三步:
1、先扫描类名
2、再扫描所有的成员变量
3、最后再扫描所有的方法体和形参的默认值
- C++中类的6个默认成员函数
- C++中类的6个默认函数
- C++基础:C++类中默认的6个函数,及深拷贝和浅拷贝
- C++空类包含的6个默认构造函数
- C++类的6个默认构造函数
- 关于类的6个默认成员函数
- c++/c中函数默认参数的详细解析
- C++class默认生成4个函数
- C++class默认生成4个函数
- C++class默认生成4个函数
- C++class默认生成4个函数
- 在C语言中模拟含有默认参数的函数
- 【C++缺省函数】 空类默认产生的6个类成员函数
- 【C++缺省函数】 空类默认产生的6个类成员函数
- 类中默认的成员函数
- C++类的4个默认成员函数
- C++空类默认产生6个类成员函数
- 详解C++类中的6个默认成员函数
- linux yum安装命令 (含光盘yum源的搭建)
- SparkSQL与Hive on Spark的比较
- 关于vue.js版本问题
- 第11周项目2
- 助力中国制造2025,英飞凌联合西安交大发布《智能制造管理白皮书》
- C++中类的6个默认函数
- Java开发命名规范
- astra pro获取彩色图原始实例
- 关于绝对路径和相对路径
- 连地产大佬都看好的健康产业,科技企业有哪些机会?
- bug—TypeError: only length-1 arrays can be converted to Python scalars
- 能否成为存储行业风向标?第二届日知录企业存储峰会落幕
- 马云:给我一个双11,我就能激发全球社会化大协同
- 不是不想恋爱,而是不想随便恋爱。写的太棒了