02-4 构造函数调用规则
写了一个类,c++的编译器会给这个类自动添加四个函数,但是我们目前只用知道前三个。
- 默认构造函数(无参,函数体为空)
- 默认析构函数(无参,函数体为空)
- 默认拷贝构造函数(对属性进行值拷贝)。
构造函数调用规则如下:
- 如果用户定义了有参构造函数,c++不会再自动提供默认构造函数(也就是没有参数,函数体为空的),但是会提供默认拷贝构造函数。
- 如果用户定义了拷贝构造函数,c++不会提供任何其他的构造函数。
-
如果用户定义了有参构造函数,c++不会再自动提供默认构造函数,但是会提供默认拷贝构造函数。
#include
using namespace std; class Person { public: int m_age; Person() { cout << "这是 Person 的默认构造函数调用。" << endl; } Person(int age) { m_age = age; cout << "这是 Person 的有参构造函数调用。" << endl; } //Person(const class Person& p) //{ // m_age = p.m_age; // cout << "这是 Person 的拷贝构造函数调用。" << endl; //} ~Person() { cout << "这是 Person 的析构函数调用。" << endl; } }; void main() { class Person p1; p1.m_age = 18; class Person p2(p1); cout << p2.m_age << endl; } 运行结果:(环境:Windows11(arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
这是 Person 的默认构造函数调用。 18 这是 Person 的析构函数调用。 这是 Person 的析构函数调用。
我们没有提供拷贝构造函数(注释掉了),但是编译器会自动提供一个拷贝构造函数(所以
p2.m_age
会被正确赋值) -
如果用户定义了有参构造函数,c++不会再自动提供默认构造函数。
#include
using namespace std; class Person { public: int m_age; //Person() //{ // cout << "这是 Person 的默认构造函数调用。" << endl; //} Person(int age) { m_age = age; cout << "这是 Person 的有参构造函数调用。" << endl; } //Person(const class Person& p) //{ // m_age = p.m_age; // cout << "这是 Person 的拷贝构造函数调用。" << endl; //} ~Person() { cout << "这是 Person 的析构函数调用。" << endl; } }; void main() { class Person p1; } 这里会报错:
类 "Person" 不存在默认构造函数
-
如果用户定义了拷贝构造函数,c++不会提供任何其他的构造函数。
#include
using namespace std; class Person { public: int m_age; //Person() //{ // cout << "这是 Person 的默认构造函数调用。" << endl; //} //Person(int age) //{ // m_age = age; // cout << "这是 Person 的有参构造函数调用。" << endl; //} Person(const class Person& p) { m_age = p.m_age; cout << "这是 Person 的拷贝构造函数调用。" << endl; } ~Person() { cout << "这是 Person 的析构函数调用。" << endl; } }; void main() { class Person p1; p1.m_age = 18; class Person p2(10); } 这里会报错:
类 "Person" 不存在默认构造函数
没有与参数列表匹配的构造函数 "Person::Person" 实例
:-)