构造函数的调用规则
默认情况下,编译器默认提供三个函数:
- 默认无参构造函数
- 默认析构函数
- 默认拷贝构造函数(浅拷贝),对属性进行拷贝
调用规则:
- 如果用户定义有参构造函数,则编译器就不在提供无参构造函数,但拷贝构造函数依然提供
- 如果用户定义拷贝构造函数,则编译器不在提供其他构造函数
拷贝构造函数调用时机
- 使用已创建好的对象来初始化一个新对象,即在声明的同时进行初始化
- 值传递方式给函数参数传值
- 值方式返回局部对象
赋值构造函数调用时机
- 两个已创建好的对象进行赋值(即已声明对象),声明后再进行赋值操作
#include <iostream>
class Person
{
public:
Person()
{
std::cout << "默认构造函数调用" << std::endl;
}
Person(int age)
{
m_age = age;
std::cout << "有参构造函数调用" << std::endl;
}
Person(const Person &p)
{
m_age = p.m_age;
std::cout << "拷贝构造函数调用" << std::endl;
}
Person& operator=(const Person &p)
{
m_age = p.m_age;
std::cout << "赋值构造函数调用" << std::endl;
return *this;
}
~Person()
{
std::cout << "析构函数调用" << std::endl;
}
private:
int m_age;
};
//值传递方式
void passByValue(Person p)
{
std::cout << "p对象的地址:" << (int*)&p << std::endl;
}
//值方式返回局部对象
Person returnByLocalObject()
{
Person p;
std::cout << "局部对象p的地址:" << (int*)&p << std::endl;
return p;
}
int main()
{
//1.使用已创建好的对象来初始化一个新对象
Person p1(10); //有参构造函数调用
Person p2(p1); //拷贝构造函数调用
//2.值传递方式给函数参数传值
std::cout << "p1对象的地址:" << (int*)&p1 << std::endl;
passByValue(p1);
//3.值方式返回局部对象
Person p = returnByLocalObject();
std::cout << "局部对象返回的地址:" << (int*)&p << std::endl;
//赋值构造函数的调用
Person p3(20);
Person p4;
p4 = p3; //两个已存在的对象直接进行赋值,区别于拷贝构造是在声明的同时就进行赋值操作
Person p5 = p3; //会调用拷贝构造函数
system("pause");
return 0;
}