58 lines
1.1 KiB
C++
58 lines
1.1 KiB
C++
// 拷贝构造函数的调用时机
|
||
// 编译器优化,不会调用拷贝构造函数,而是直接创建一个返回值的引用
|
||
#include <iostream>
|
||
|
||
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) // ?是否调用拷贝构造函数
|
||
{
|
||
cout << "test1(A a) a.x = " << a.x << endl;
|
||
|
||
// 当函数结束时,a 释放,会调用析构函数
|
||
}
|
||
|
||
A test2()
|
||
{
|
||
A a1; // 局部的类对象, 没有执行拷贝构造函数
|
||
a1.x = 1;
|
||
cout << "test2() a1.x = " << a1.x << endl;
|
||
return a1; // 释放局部对象 a1
|
||
}
|
||
|
||
void test3()
|
||
{
|
||
A a2 = test2(); // 返回 A 类的对象,没有调用拷贝构造函数,只是创建了一个 test2() 返回值的引用
|
||
cout << "test3() a2.x = " << a2.x << endl;
|
||
}
|
||
|
||
int main()
|
||
{
|
||
A a0;
|
||
// test1(a0); // 作为值传递,调用拷贝构造函数
|
||
|
||
test3();
|
||
cout << "over" << endl;
|
||
return 0;
|
||
}
|