C++返回區域性物件並使用時,並沒有呼叫賦值運算子函式或拷貝建構函式
阿新 • • 發佈:2020-12-09
可以看出只要是返回區域性物件(返回匿名物件也一樣),如果將它賦值給物件,或者是將它作為拷貝建構函式的引數,都不會呼叫你以為的那個函式。
…………至於為什麼改日再究。
# 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();