构造函数的分类及调用(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 }

 

posted @ 2020-04-11 11:49  坦率  阅读(226)  评论(0编辑  收藏  举报