拷贝构造函数
Posted zzx1905
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拷贝构造函数相关的知识,希望对你有一定的参考价值。
1、构造函数和析构函数
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <iostream> 3 #include<cstdlib> 4 5 using namespace std; 6 7 class Test { 8 public: 9 Test() { 10 11 } 12 Test(int x, int y) { 13 m_x = x; 14 m_y = y; 15 name = (char*)malloc(100); 16 strcpy(name, "zhang3"); 17 //此时在堆上开辟了空间,Test对象相关的函数都执行完后会自行销毁(栈上空间) 18 //但是堆上的空间就变成了垃圾 19 //造成内存泄露,需要析构函数来完成释放堆上空间 20 } 21 ~Test() { 22 cout << "~Test()" << endl; 23 if (name != NULL) { 24 free(name); 25 cout << "free succ" << endl; 26 } 27 } 28 void print_t() { 29 cout << "x=" << m_x << ",y=" << m_y << endl; 30 } 31 private: 32 int m_x; 33 int m_y; 34 char *name; 35 }; 36 37 void test1() { 38 Test t1(10, 20); 39 t1.print_t(); 40 } 41 int main(void) { 42 test1(); 43 system("pause"); 44 return 0; 45 }
2、拷贝构造函数
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <iostream> 3 #include<cstdlib> 4 5 using namespace std; 6 7 class Test { 8 public: 9 //显示无参构造、显示有参构造、显示拷贝构造都会使默认的无参构造函数无效 10 //默认的无参构造函数属性值随机分配,所以如果需要无参构造函数,还是需要自定义一个 11 Test() { 12 m_x = 0; 13 m_y = 0; 14 } 15 Test(int x, int y) { 16 m_x = x; 17 m_y = y; 18 } 19 ~Test() { 20 cout << "~Test()" << endl; 21 } 22 void print_t() { 23 cout << "x=" << m_x << ",y=" << m_y << endl; 24 } 25 #if 0 26 //拷贝构造函数的显示形式,const修饰是为了保护参数 27 Test(const Test &another) { 28 m_x = another.m_x; 29 m_y = another.m_y; 30 } 31 //=等号操作符重载 32 void operator=(const Test &another) { 33 m_x = another.m_x; 34 m_y = another.m_y; 35 } 36 #endif 37 38 private: 39 int m_x; 40 int m_y; 41 }; 42 43 int main(void) { 44 Test t1(100, 200); 45 Test t2(t1);//调用默认的拷贝构造函数 46 t2.print_t(); 47 48 Test t3 = t1;//初始化t3时调用t3的拷贝构造函数 49 Test t4; 50 t4 = t1;//此时调用的不是拷贝构造函数,而是赋值操作符重载函数 51 system("pause"); 52 return 0; 53 }
3、 应用场景
3.1 如果函数返回值是用一个对象接收的,那么会发生一个值拷贝,通过拷贝构造函数创建一个匿名对象。如下有函数Test func2(){ }:
3.2 如果返回值有一个对象来接收,那么这个接收过程不会出发值拷贝。
3.3 另一种更为复杂的情况,等号操作符重载:
以上是关于拷贝构造函数的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段
Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段