构造函数调用规则

首先我们知道只要创建一个类编译器会提供三个默认函数

1.默认构造函数 (无参,空实现)

2.默认析构函数(无参,空实现)

3.默认拷贝构造函数,对值属性进行拷贝

调用规则如下

1.如果我们定义有参构造函数,编译器不会提供默认构造函数,但提供默认拷贝构造函数

2.如果用户定义了拷贝构造函数,编译器将不会提供其他构造函数

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 class person
 5 {
 6 public:
 7     person()
 8     {
 9         puts("默认构造函数调用");
10     }
11
12     person(const person &p)
13     {
14         m_age = p.m_age;
15         puts("拷贝构造函数调用");
16     }
17
18     person(int age)
19     {
20         m_age = age;
21         puts("有参构造函数调用");
22     }
23
24     ~person()
25     {
26         puts("析构函数调用");
27     }
28
29     int m_age;
30 };
31
32 void test()
33 {
34     person p;
35     p.m_age = 18;
36     person p2(p);
37     cout << p2.m_age << endl;
38 }
39
40 int main()
41 {
42     test();
43     return 0;
44 }

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 class person
 5 {
 6 public:
 7     person()
 8     {
 9         puts("默认构造函数调用");
10     }
11
12 //    person(const person &p)
13 //    {
14 //        m_age = p.m_age; 默认拷贝构造函数会执行这里,把所有值属性拷贝
15 //        puts("拷贝构造函数调用");
16 //    }
17
18     person(int age)
19     {
20         m_age = age;
21         puts("有参构造函数调用");
22     }
23
24     ~person()
25     {
26         puts("析构函数调用");
27     }
28
29     int m_age;
30 };
31
32 void test()
33 {
34     person p;
35     p.m_age = 18;
36     person p2(p);
37     cout << p2.m_age << endl;
38 }
39
40 int main()
41 {
42     test();
43     return 0;
44 }

下面代码证明了定义有参构造函数,编译器不会提供默认构造函数,但提供默认拷贝构造函数

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 class person
 5 {
 6 public:
 7     person()
 8     {
 9         puts("默认构造函数调用");
10     }
11
12 //    person(const person &p)
13 //    {
14 //        m_age = p.m_age; 默认拷贝构造函数会执行这里,把所有值属性拷贝
15 //        puts("拷贝构造函数调用");
16 //    }
17
18     person(int age)
19     {
20         m_age = age;
21         puts("有参构造函数调用");
22     }
23
24     ~person()
25     {
26         puts("析构函数调用");
27     }
28
29     int m_age;
30 };
31
32 void test()
33 {
34     person p;
35     p.m_age = 18;
36     person p2(p);
37     cout << p2.m_age << endl;
38 }
39
40 void test01()
41 {
42     person p(22);
43     person p2(p);
44     cout << p2.m_age << endl;
45  }
46 int main()
47 {
48     //test();
49     test01();
50     return 0;
51 }

关于第二个规则,如果你可以把除了拷贝构造函数的其他构造函数去掉,你运行是报错的

说明如果用户定义了拷贝构造函数,编译器将不会提供其他构造函数

原文地址:https://www.cnblogs.com/mch5201314/p/11602407.html

时间: 2024-10-28 10:36:58

构造函数调用规则的相关文章

Swift 2.0学习笔记(Day 42)——构造函数调用规则

原创文章,欢迎转载.转载请注明:关东升的博客 在构造函数中可以使用构造函数代理帮助完成部分构造工作.类构造函数代理分为横向代理和向上代理,横向代理只能在发生在同一类内部,这种构造函数称为便利构造函数.向上代理发生在继承的情况下,在子类构造过程中,要先调用父类构造函数初始化父类的存储属性,这种构造函数称为指定构造函数. 构造函数调用规则 Person和Student类示例: class Person { var name: String var age: Int func description(

《从零开始学Swift》学习笔记(Day 42)——构造函数调用规则

原创文章,欢迎转载.转载请注明:关东升的博客 在构造函数中可以使用构造函数代理帮助完成部分构造工作.类构造函数代理分为横向代理和向上代理,横向代理只能在发生在同一类内部,这种构造函数称为便利构造函数.向上代理发生在继承的情况下,在子类构造过程中,要先调用父类构造函数初始化父类的存储属性,这种构造函数称为指定构造函数. 构造函数调用规则 Person和Student类示例: class Person {     var name: String     var age: Int          

函数,方法,构造函数调用

1.函数调用 Function绝对是JavaScript中的重中之重.在JavaScript中,Function承担了procedures, methods, constructors甚至是classes以及modules的功能. 在面向对象程序设计中,functions,methods以及class constructor往往是三件不同的事情,由不同的语法来实现.但是在JavaScript中,这三个概念都由function来实现,通过三种不同的模式. 最简单的使用模式就是function 调用

java初始化构造函数调用顺序

类初始化时构造函数调用顺序: (1)初始化对象的存储空间为零或null值:  (2)调用父类构造函数:  (3)按顺序分别调用类成员变量和实例成员变量的初始化表达式:  (4)调用本身构造函数. 例子:public class Dollar extends Money{     Rmb r=new Rmb()     public Dollar(){      System.out.println("Dollar is construct!");     }     public st

C++多重继承构造函数调用顺序

//以典型实例说明 1 class B1{}; 2 class V1:public B1(); 3 class D1:virtual public V1(); 4 class B2{}; 5 class B3{}; 6 class V2:public B1,publicB2{}; 7 class D2:virtual public V2,public B3{}; 8 class M1{}; 9 class M2{}; 10 class X:public D1,public D2 11 { 12

JavaScript函数调用规则

1. [代码][JavaScript]代码     JavaScript函数调用规则一 (1)全局函数调用:function makeArray( arg1, arg2 ){    return [this , arg1 , arg2 ];}这是一个最常用的定义函数方式.相信学习JavaScript的人对它的调用并不陌生.调用代码如下:makeArray('one', 'two');// => [ window, 'one', 'two' ] 这种方式可以说是全局的函数调用.为什么说是全局的函数

C++中构造函数调用构造函数

今天想做道矩阵的题目时,却卡在一些编程细节上了,找了好久才发现原来是在构造函数处出了问题,然后上网百度了下,发现这篇文章说得很好:从一道题谈C++中构造函数调用构造函数,很棒! 还补充一点: 看来自己C++的基本功还有待提高啊~~

C++中类的构造函数调用顺序

当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止.简而言之,对象是由"底层向上"开始构造的.因为,构造函数一开始构造时,总是要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时,如果无专门说明,就调用直接基类的默认构造函数.在对象析构时,其顺序正好相反. 下面的这个程序说明这个问题 总结下来,我们必须明确的是当一个类继承与基类,并且自身还包含有其他类的成员对象的时候,构造函

[development][c++] C++构造函数调用构造函数

构造函数调用构造函数是会问题的. 外层函数返回的内存, 与被调用的构造函数返回的内存并不是一个内存. 错误示例代码如下: msg_log(const char *name, const char* thread_name, const char *cfg_file, int type = STREAM, int level = MSG_ERROR) : _name(name), _thread_name(thread_name), _level(level), _type(type), logf