// 拷贝构造函数的调用时机 // 编译器优化,不会调用拷贝构造函数,而是直接创建一个返回值的引用 #include using namespace std; class A { public: int x = 0; public: A() { cout << this << " A()" << endl; } A(const A &other) { this->x = other.x; cout << this << " A(const A &other)" << endl; } ~A() { cout << this << " ~A()" << endl; } }; void test1(A &a) // ?是否调用拷贝构造函数 // void test1(A a) // ?是否调用拷贝构造函数 { cout << "test1(A a) a.x = " << a.x << endl; // 当函数结束时,a 释放,会调用析构函数 } A test2() // 不要声明为 A &test2(), 因为返回对象时,会释放局部对象,导致返回的引用指向一个已经释放的对象 { A a1; // 局部的类对象, 没有执行拷贝构造函数 a1.x = 1; cout << "test2() a1.x = " << a1.x << endl; return a1; // 释放局部对象 a1 } void test3() { cout << "tsss = " << endl; A a2 = test2(); // 返回 A 类的对象,没有调用拷贝构造函数,只是创建了一个 test2() 返回值的引用 cout << "test3() a2.x = " << a2.x << endl; } int main() { A a0; test1(a0); // 作为值传递,调用拷贝构造函数 // test3(); cout << "over" << endl; return 0; }