-
拷贝构造
-
1、定义
拷贝构造又称为复制构造,是一种特殊的构造函数,当使用一个现有的旧对象构造一个新对象时就会调用拷贝构造函数,拷贝构造函数只有一个引用型的参数(类对象本身)
-
2、格式:
A(const A &a)
如果没有自己实现拷贝构造函数,编译器会自动一个拷贝构造函数,负责把旧对象中的所有数据拷贝给新创建的对象(浅拷贝)
-
3、拷贝构造分为深拷贝和浅拷贝:
1、如果类中的成员有指针变量的话,那么浅拷贝只拷贝指针变量的值;
2、深拷贝则是拷贝指针变量所指向的目标。系统自动生成的拷贝构造函数是浅拷贝,如果要深拷贝需要我们手动实现。
什么情况下需要实现深拷贝?
当类中有指针变量时,因为如果有指针变量,我们用浅拷贝的话,那么拷贝的是指针变量的值,意味着两个指针同时指向了这一块内存,那么在执行析构函数时,就会出现重复释放的情况,会造成堆崩溃。
什么情况下会调用拷贝构造函数
1、使用旧对象构造新对象时
2、使用对象当作函数的参数时,当调用函数时,就会一起调用拷贝构造。 -
4、返回局部对象的值
函数在返回局部对象的时候,会先调用复制构造函数复制一个临时对象进行返回;函数不要返回指向局部对象指针或引用
-
-
赋值构造
-
例子
#include <iostream> using namespace std; class machine; ostream& operator<<(ostream& o,const machine& m); class test { private: int num; public: test(){ num = 0; } test fun1() //返回类的对象 { num++; return *this; } test& fun2() //返回类的引用 { return *this; } friend ostream& operator<<(ostream& o,const test& m); }; ostream& operator<<(ostream& o,const machine& m) { o<<m.num; return o; }; int main(int argc, char **argv) { test m; m.fun1(); cout<<m<<endl; //1 m.fun2(); cout<<m<<endl; //1 m.fun1().fun1(); cout<<m<<endl; //2 m.fun2().fun2(); cout<<m<<endl; //2 m.fun1().fun2(); cout<<m<<endl; //3 m.fun2().fun1(); cout<<m<<endl; //4 } }
C++ 赋值构造和拷贝构造
于 2022-04-16 23:12:33 首次发布