1. 程式人生 > 其它 >C++返回區域性物件並使用時,並沒有呼叫賦值運算子函式或拷貝建構函式

C++返回區域性物件並使用時,並沒有呼叫賦值運算子函式或拷貝建構函式

技術標籤:筆記c++

可以看出只要是返回區域性物件(返回匿名物件也一樣),如果將它賦值給物件,或者是將它作為拷貝建構函式的引數,都不會呼叫你以為的那個函式。
…………至於為什麼改日再究。

# 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);
1


Data b(f());
2


Data b(g());
3


b = f();4