两个特别的构造函数

Posted lemaden

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个特别的构造函数相关的知识,希望对你有一定的参考价值。

 

-无参构造函数

 没有参数的构造函数:

 当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空;

-拷贝构造函数

 参数为const class_name & 的构造函数 (当前类对象的引用):

  当类中没有定义拷贝构造函数,编译器默认提供一个拷贝构造函数,简单的进行成员变量的复制。

实例一:

 1 #include <stdio.h>
 2 
 3 class Test
 4 {
 5 private:
 6     int i;
 7     int j;
 8 public:
 9     int getI()
10     {
11         return i;
12     }
13     int getJ()
14     {
15         return j;
16     }
17     /*Test(const Test& t)
18     {
19         i = t.i;
20         j = t.j;
21     }
22     Test()
23     {
24     }*/
25 };
26 
27 int main()
28 {
29     Test t1;
30     Test t2 = t1;
31     
32     printf("t1.i = %d, t1.j = %d\\n", t1.getI(), t1.getJ());
33     printf("t2.i = %d, t2.j = %d\\n", t2.getI(), t2.getJ());
34     
35     return 0;
36 }

 

拷贝构造函数意义:

1.兼容C语言的初始化方式;

2.初始化行为能够符合预期的逻辑;

浅拷贝:

拷贝后对象的物理状态相同;

深拷贝:

拷贝后对象的逻辑状态相同。

编译器提供的拷贝函数只进行浅拷贝。(简单的复制工作)
 
 1 #include <stdio.h>
 2 
 3 class Test
 4 {
 5 private:
 6     int i;
 7     int j;
 8     int* p;
 9 public:
10     int getI()
11     {
12         return i;
13     }
14     int getJ()
15     {
16         return j;
17     }
18     int* getP()
19     {
20         return p;
21     }
22     Test(const Test& t)
23     {
24         i = t.i;
25         j = t.j;
26         p = new int;
27         
28         *p = *t.p;
29     }
30     Test(int v)
31     {
32         i = 1;
33         j = 2;
34         p = new int;
35         
36         *p = v;
37     }
38     void free()
39     {
40         delete p;
41     }
42 };
43 
44 int main()
45 {
46     Test t1(3);
47     Test t2(t1);
48     
49     printf("t1.i = %d, t1.j = %d, *t1.p = %d\\n", t1.getI(), t1.getJ(), *t1.getP());
50     printf("t2.i = %d, t2.j = %d, *t2.p = %d\\n", t2.getI(), t2.getJ(), *t2.getP());
51     
52     t1.free();
53     t2.free();
54     
55     return 0;
56 }

 

 

 

 

 

 

 

 

 

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

面向对象的内功心法

在 Visual Studio 中创建构造函数的代码片段或快捷方式

构造函数

Java构造函数

golang语言构造函数

C#构造函数