构造函数的分类及调用(2)

两种分类方式:

1.按参数分为:有参构造和无参构造(默认构造)

2.按类型分为:普通构造和拷贝构造

三种调用方式:

1.括号法

2.显示法

3.隐式转换法

匿名对象的特点:特点:当前行执行结束后,系统会立即回收掉匿名对象

 1 #include <iostream>
 2 using namespace std;
 3
 4 class Person
 5 {
 6 public:
 7     //构造函数
 8     Person()
 9     {
10         cout << "Person默认构造函数的调用" << endl;
11     }
12
13     //有参构造函数
14     Person(int a)
15     {
16         age = a;
17         cout << "Person有参构造函数的调用" << endl;
18     }
19
20     //拷贝构造函数,"拷贝":将**实例化**的所有属性,一字不动(const)的拷贝(引用&)一份
21     Person(const Person &p)
22     {
23         age = p.age;
24         cout << "Person拷贝构造函数的调用" << endl;
25     }
26
27     //析构函数
28     ~Person()
29     {
30         cout << "Person析构函数的调用" << endl;
31     }
32
33     int age;
34
35 };
36
37 //调用
38 void test_01(void)
39 {
40     //1.括号法
41     //Person p1;//默认构造函数(就是无参构造函数)的调用
42     //Person p2(10);//有参构造函数调用
43     //Person p3(p2);//拷贝构造函数的调用
44
45     //注意事项:
46     //调用默认构造函数时,不要加(),Person p1()无法创建对象,因为编译器把它当作函数的声明,是不会创建对象的
47
48     //cout << "p2的年龄:" << p2.age << endl;
49     //cout << "p3的年龄:" << p3.age << endl;//拷贝p2的所有属性
50
51     //2.显式法
52     //Person p1;
53     //Person p2 = Person(10);//有参构造函数的调用
54     //Person p3 = Person(p2);//拷贝构造函数的调用
55
56     Person(10);//匿名对象    特点:当前行执行结束后,系统会立即回收掉匿名对象
57     cout << "aaaaa" << endl;
58
59
60     //3.隐式转换法
61 }
62
63 int main(void)
64 {
65     test_01();
66
67     system("pause");
68     return 0;
69 }

观察:

结论:匿名对象在执行完之后就立即被释放了!(就立即被析构了~~~~)

 1 #include <iostream>
 2 using namespace std;
 3
 4 class Person
 5 {
 6 public:
 7     //构造函数
 8     Person()
 9     {
10         cout << "Person默认构造函数的调用" << endl;
11     }
12
13     //有参构造函数
14     Person(int a)
15     {
16         age = a;
17         cout << "Person有参构造函数的调用" << endl;
18     }
19
20     //拷贝构造函数,"拷贝":将**实例化**的所有属性,一字不动(const)的拷贝(引用&)一份
21     Person(const Person &p)
22     {
23         age = p.age;
24         cout << "Person拷贝构造函数的调用" << endl;
25     }
26
27     //析构函数
28     ~Person()
29     {
30         cout << "Person析构函数的调用" << endl;
31     }
32
33     int age;
34
35 };
36
37 //调用
38 void test_01(void)
39 {
40     //1.括号法
41     //Person p1;//默认构造函数(就是无参构造函数)的调用
42     //Person p2(10);//有参构造函数调用
43     //Person p3(p2);//拷贝构造函数的调用
44
45     //注意事项:
46     //调用默认构造函数时,不要加(),Person p1()无法创建对象,因为编译器把它当作函数的声明,是不会创建对象的
47
48     //cout << "p2的年龄:" << p2.age << endl;
49     //cout << "p3的年龄:" << p3.age << endl;//拷贝p2的所有属性
50
51     //2.显式法
52     //Person p1;
53     //Person p2 = Person(10);//有参构造函数的调用
54     //Person p3 = Person(p2);//拷贝构造函数的调用
55
56     //Person(10);//匿名对象    特点:当前行执行结束后,系统会立即回收掉匿名对象
57     //cout << "aaaaa" << endl;
58
59     //注意事项
60     //不要用拷贝构造函数,初始化匿名对象,编译器会认为Person(p3)==Person p3对象的声明,会报重定义
61     //Person(p3);
62
63     //3.隐式转换法
64     Person p4 = 10;//相当于写了Person p4 = Person(10);有参构造函数的调用
65     Person p5 = p4;//拷贝构造函数的调用
66 }
67
68 int main(void)
69 {
70     test_01();
71
72     system("pause");
73     return 0;
74 }

原文地址:https://www.cnblogs.com/huanian/p/12678575.html

时间: 2024-08-04 13:08:11

构造函数的分类及调用(2)的相关文章

构造函数的分类及调用

构造函数可以使用两种方式进行分类: 按参数分为:无参构造和有参构造 按类型分为:普通构造和拷贝构造 class Person { public: //无参构造(也可称为默认构造) Person() { cout << "Person的无参构造" << endl; } //有参构造 Person(int a) { age = a; cout << "Person的有参构造" << endl; } //拷贝构造函数 Per

c++学习笔记5,多重继承中派生类的构造函数与析构函数的调用顺序(二)

现在来测试一下在多重继承,虚继承,MI继承中虚继承中构造函数的调用情况. 先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; }

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

http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2: 构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 参考3: C++构造函数与析构函数的调用顺序 2.构造函数.析构函数与拷贝构造函数介绍 2.1构造函数 构造函数不能有返回值 缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 创建一个对象

Effective C++ Item 09-绝不在构造函数和析构函数中调用virtual函数

Item 09-绝不在构造函数和析构函数中调用virtual函数(Never call virtual functions during construction or destruction) Why? 由于base class构造函数的执行更早于derived class构造函数,当base class构造函数执行derived class的成员变量尚未初始化.如果期间调用的virtual函数下降至derived class阶层,要知道derived class的函数几乎必然取用local成

C++构造函数的自动调用(调用一个父类的构造函数,有显性调用最好,否则就默认调用无参数的构造函数)——哲学思想:不调用怎么初始化父类的成员数据和VMT?

我总是记不住构造函数的特点,关键还是没有领会那个哲学思想:父类的构造函数一方面要初始化它自己的成员数据,另一方面也要建立它自己的VMT呀!心里默念一百遍:一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VM

【C/C++】构造函数与析构函数的调用顺序

常见问题 Q1. 以下代码的输出结果是什么? 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A() { cout << "A" << endl; } 8 ~A() { cout << "~A" << endl; } 9 }; 10 class B : public A 11 { 12 public: 13 B

拷贝构造函数和赋值运算符的调用情况

很多情况下,对于 如下的说明,很难接受 int a(10); 其实完全等价于int a=10; 所以下面的情况更加难以接受: class A;//定义class A 应用: A a; A b(a);//其实完全等价于A b=a,调用的都是拷贝构造函数,在所有人的眼中如果不是,非常熟悉这样赋值的方式,还真是看做是赋值运算. 例子如下: void Test(A a) { } 在这个函数中,通过值的传递,其实调用的是拷贝构造函数,而没有调用赋值运算符,或者默认的构造函数, class T { publ

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

一般而言,析构函数调用的顺序和构造函数调用顺序相反,但是,对象的存储类别可以改变调用析构函数的顺序.举例说明: CreateAndDestroy类的定义 CreateAndDestroy类的成员函数的定义 测试函数 构造函数和析构函数的调用顺序: 分析 全局作用域内定义的对象的构造函数,在文件内任何其他函数(包括main函数)开始执行之前调用,当main函数执行结束时,相应的析构函数被调用,如上面的Object 1. exit函数迫使程序立即结束,不执行自动对象的析构函数.当程序中检测到输入中有

类继承时,构造函数和析构函数的调用次序

比如,apple类是fruit类的子类,当执行apple a("红富士");的时候,将先调用fruit类的构造函数,再调用apple类的构造函数 同理,假设在程序里先后声明了两个apple实例: apple a(“红富士"); apple b("青香蕉"); 当函数退出时,要先销毁b,再销毁a(因为b在栈顶). 而调用析构函数时,先调用apple的析构函数,再调用fruit的析构函数. 综上可见,构造函数和析构函数的调用次序恰好反了个个儿. Java和C+