构造函数调用规则

  • 默认情况下,c++编译器会给一个类添加三个函数

    (1)默认构造函数(无参,函数体为空)

    (2)默认析构函数(无参,函数体为空)

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

    (4)赋值运算符 operator= ,对属性进行值拷贝

  • 构造函数调用规则如下:

    (1)如果用户只定义有参构造函数,c++不在提供默认无参构造,但是会提供默认拷贝构造

    (2)如果用户只定义拷贝构造函数,c++不会在提供其他构造函数

示例1:不定义默认构造函数,只定义有参构造函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
using namespace std;
class Person {
public:
Person(int a) {
age = a;
cout << "Person 的有参构造函数调用。" << endl;
}
~Person() {
cout << "Person 的析构函数调用。" << endl;
}
int age;
};
int main() {
//Person p;//报错,写了有参构造函数,编译器不会提供默认构造函数
Person p(10);
Person p1(p);//有默认的拷贝构造函数
cout << "p1的年龄" << p1.age << endl;
return 0;
}

运行结果:

1
2
3
4
Person 的有参构造函数调用。
p1的年龄10
Person 的析构函数调用。
Person 的析构函数调用。

示例二:只定义拷贝构造函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
using namespace std;
class Person {
public:
Person(const Person &p) {
age = p.age;
cout << "Person 的拷贝构造函数调用。" << endl;
}
~Person() {
cout << "Person 的析构函数调用。" << endl;
}
int age;
};
int main() {
//Person p;//报错,写了有参构造函数,编译器不会提供默认构造函数
//Person p(10);报错
//Person p1(p);
cout << "p1的年龄" << p1.age << endl;
return 0;
}