一.复制构造函数 #include<iostream> using namespace std; class A { public: A(int x, int y)//构造函数 { m = x; n = y; } A(A& t)//复制函数 { m = t.m; n = t.n; } void print(void){cout << n << m <<endl;} private: int m; int n; }; int main(void) { A a(2,4); a.print(); A b(a);//调用了复制构造函数进行复制 b.print(); return 0; } 二.浅层复制构造函数 每个对象都有默认的复制构造函数,但是默认的复制构造函数只是把传递进来的每个成员变量的值复制给新对象的成员变量,当变量是指针的时候可能会出现问题。 #include<iostream> using namespace std; class A { public: A()//构造函数 { m = new int; *m = 10; } A(A& t)//复制函数 { m = t.m; } void set(int x){ *m = x;} void print(void){cout << * m <<endl;} private: int* m; }; int main(void) { A a; a.print();//10 A b(a);//调用了复制构造函数进行复制 b.print();//10 b.set(5); b.print()//5; a.print();//5 //delete a;//编译错误,析构a的同时将b的m指针指向的那块内存也析构了,所以b.m此时已经是迷途指针,程序处于崩溃边缘 return 0; } 三.深层复制构造函数 对于浅层复制构造函数所产生的问题可以通过自己构建深层复制构造函数来解决。 #include<iostream> using namespace std; class A { public: A()//构造函数 { m = new int; *m = 10; } A(A& t)//深层复制构造函数 { m = new int; *m = *(t.m); } void set(int x){ *m = x;} void print(void){cout << * m <<endl;} private: int* m; }; int main(void) { A a; a.print();//10 A b(a);//调用了复制构造函数进行复制 b.print();//10 b.set(5); b.print()//5; a.print();//10 delete a;//不会出现编译错误,因为经过深层复制构造函数构造的b的m指针于a的m指针分别指向了两块不同的内存 return 0; }
C++学习笔记--复制构造函数
最新推荐文章于 2024-07-20 17:20:09 发布