可以看出只要是返回局部对象(返回匿名对象也一样),如果将它赋值给对象,或者是将它作为拷贝构造函数的参数,都不会调用你以为的那个函数。
…………至于为什么改日再究。
# include <iostream>
using namespace std;
struct Data{
int a;
Data(){
cout << "无参构造函数\n";
}
Data(int b){
this->a = b;
cout << "一参构造函数\n";
}
Data(const Data &ob){
cout << "拷贝构造函数\n";
}
Data & operator=(const Data & rhs){
cout << "赋值运算符函数\n";
return *this;
}
~Data(){
cout << "析构函数\n";
}
};
Data f(){
cout << "in f()\n";
return Data(); // 输出:无参构造函数
}
Data g(){
Data a; // 输出:无参构造函数
cout << "in g()\n";
return a; // 无输出
}
void test1(){
cout << "-----------------\n";
Data a;
cout << "-----------------\n";
Data b(a); // 调用拷贝赋值函数
cout << "-----------------\n";
}
void test2(){
cout << "-----------------\n";
Data a;
cout << "-----------------\n";
Data b(f()); // 不调用拷贝赋值函数
cout << "-----------------\n";
}
void test3(){
cout << "-----------------\n";
Data a;
cout << "-----------------\n";
Data b(g()); // 不调用拷贝赋值函数
cout << "-----------------\n";
}
void test4(){
cout << "-----------------\n";
Data a;
cout << "-----------------\n";
Data b = f(); // 调用拷贝赋值函数(g也是一样的)
cout << "-----------------\n";
}
int main()
{
test1();
test2();
test3();
return 0;
}
Data b(a);
Data b(f());
Data b(g());
b = f();