C++学习笔记--复制构造函数
2013-11-15 14:14
585 查看
一.复制构造函数 #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++学习笔记--复制构造函数
- C++学习笔记1(结构体,命名空间,标准输入输出,引用,函数,构造函数)
- C++学习笔记一、构造函数和析构函数的概念
- C++学习笔记之(对象复制的困惑)
- c++学习笔记(一):c++构造函数
- C++学习笔记_2:单一继承时的构造函数与析构函数
- C++ 构造函数初始化列表学习笔记
- 【菜鸟C++学习笔记】12.构造函数与析构函数
- C++学习笔记:类、构造函数
- C++学习笔记(调用构造函数和析构函数的顺序)
- C++学习笔记 lesson3 构造函数
- C++学习笔记1:构造函数和析构函数
- C++ 学习笔记(13)拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符、析构函数、右值引用、引用限定符
- C++学习笔记-构造函数
- C++学习笔记(6)----基类和派生类的构造函数和析构函数的执行顺序
- C++学习笔记-----不要在构造函数和析构函数中调用虚函数
- C++学习笔记51——在构造函数和析构函数中调用虚函数
- C++ 学习笔记(18)异常处理(noexcept说明符和noexcept运算符、构造函数的try和catch)、命名空间(using声明和using指示)、多继承(虚继承)
- C++学习笔记(九):类的构造函数
- c++ primer 学习笔记:类之构造函数