构造函数的分类和调用

  • 分类方式

    (1)按参数分:有参构造和无参构造

示例:

1
2
3
4
5
6
7
8
9
10
11
class Person {
public:
Person() {
cout << "Person 的无参构造函数的调用" << endl;
}
Person(int a) {
age = a;
cout << "Person 的有参构造函数的调用" << endl;
}
int age;
};

​ (2)按类型分:普通构造和拷贝构造

示例:

1
2
3
4
5
6
7
8
9
10
class Person {
public:
//拷贝构造函数语法: 类名(const 类名 &对象名)
Person(const Person &p) {
//将传入的person属性传到我身上
age = p.age;
cout << "Person 的拷贝构造函数的调用" << endl;
}
int age;
};
  • 调用方式

    (1)括号法

示例:

1
2
3
Person p;       //默认构造函数的调用
Person p2(10); //调用有参构造函数
Person p3(p2); //调用拷贝构造函数

​ (2)显示法

示例:

1
2
Person p4 = Person(10);//有参构造
Person p5 = Person(p4);//拷贝构造

​ (3)隐式转换法

1
2
Person p6 = 10;//等同于 Person p6 = Person(10);
Person p7 = p6;//等同于 Person p6 = Person(p6);
  • 注意事项

    (1)当调用默认构造函数加 () ,编译器认为是一个函数声明,不会认为在创建对象。

示例:通过观察是否调用构造函数来判断

1
2
3
4
5
6
7
8
9
void test01() {
cout<<"aaa"<<endl;
Person p1(); //编译器认为是一个函数声明,不会认为在创建对象
}
int main() {
test01();
system("pause");
return 0;
}

(2)匿名函数:当前行执行结束后,系统会自动回收这个对象

1
Person(20); //单独拿出来就是匿名对象

(3)利用拷贝构造函数初始化匿名对象,要注意重定义

1
2
Person p; 
Person (p);//编译器自动认为 Person(p); 等同于 Person p; 造成重定义
  • 整体代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<iostream>
using namespace std;
class Person {
public:
Person() {
cout << "Person 的无参构造函数的调用" << endl;
}
Person(int a) {
age = a;
cout << "Person 的有参构造函数的调用" << endl;
}
//拷贝构造函数 类名( const 类名 &对象名)
Person(const Person &p) {
//将传入的person属性传到我身上
age = p.age;
cout << "Person 的拷贝构造函数的调用" << endl;
}
~Person() {
cout << "Person 的析构函数的调用" << endl;
}
int age;
};
//调用
void test01() {
Person p;//默认构造函数的调用
Person p2(10);//调用有参构造函数
Person p3(p2);//调用拷贝构造函数

//注意:调用默认构造函数不要加 ()
Person p1();//编译器认为是一个函数声明,不会认为在创建对象

cout << "p2的年龄:" << p2.age << endl;
cout << "p3的年龄:" << p3.age << endl;

//3、显示法
Person p4 = Person(10);//有参构造
Person p5 = Person(p4);//拷贝构造

Person(20);//单独拿出来就是匿名对象,当前行执行结束后,系统会自动回收这个对象

//注意:不要利用拷贝构造函数初始化匿名对象
//Person (p);//报错,编译器自动认为 Person(p); == Person p;重定义
cout << "aaaa" << endl;

//5、隐式法
Person p6 = 10;//等同于 Person p6 = Person(10);
Person p7 = p6;//等同于 Person p6 = Person(p6);
}
int main() {
test01();
system("pause");
return 0;
}

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Person 的无参构造函数的调用
Person 的有参构造函数的调用
Person 的拷贝构造函数的调用
p2的年龄:10
p3的年龄:10
Person 的有参构造函数的调用
Person 的拷贝构造函数的调用
Person 的有参构造函数的调用
Person 的析构函数的调用
aaaa
Person 的有参构造函数的调用
Person 的拷贝构造函数的调用
Person 的析构函数的调用
Person 的析构函数的调用
Person 的析构函数的调用
Person 的析构函数的调用
Person 的析构函数的调用
Person 的析构函数的调用
Person 的析构函数的调用