拷贝构造函数

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 另一种更为复杂的情况,等号操作符重载:

  技术分享图片

 

以上是关于拷贝构造函数的主要内容,如果未能解决你的问题,请参考以下文章

拷贝构造函数(c++常问问题一)

拷贝构造函数

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

复制构造函数(拷贝构造函数)

构造函数调用