c++ 赋值函数和拷贝构造函数的调用时机
测试代码:
void testcopyAndFuzhi() {class Dog {private:string name;public:Dog(string myname) : name(myname) {}Dog(Dog& otherDog) {std::cout << "调用拷贝构造函数." << endl;this->name = otherDog.name;}Dog& operator= (Dog& otherDog) {std::cout << "调用赋值." << endl;this->name = otherDog.name;return *this;}~Dog() {}void print() const {std::cout << "dog name: " << name << endl;}};Dog d1("哈士奇"), d2("泰迪");std::cout << "开始赋值:" << endl;d1 = d2; // 调用赋值.d1.print(); // dog name: 泰迪std::cout << "================" << endl;Dog d3(d2); // 调用拷贝构造函数.std::cout << "----------------" << endl;Dog d4 = d3; // 调用拷贝构造函数.
}
打印:
拷贝构造函数的调用时机:
1、对象初始化时,用已有对象初始化新对象;
2、值传递参数,对象作为函数参数按值传递时;
3、值返回对象,函数返回对象且未触发返回值优化(RVO);
4、异常处理,抛出或捕获异常对象时
赋值运算符重载的调用时机:
1、对象已存在时:对已构造对象进行赋值(如 obj2 = obj1;
)
关键区别:拷贝构造函数用于创建新对象并初始化, 而赋值运算符用于修改已存在对象的值