C++ 無名對象


http://blog.sina.com.cn/s/blog_5f0e13360100bxlj.html

可以直接調用構造函數產生無名對象。

    例如,下面的代碼在函數fn()中,創建了一個無名對象:

class Student

{

public:

    Student(char*);

};

void fn()

{

    Student("Randy"); // 此處為無名對象

}

    無名對象可以作為實參傳遞給函數,可以拿來拷貝構造一個新對象,也可以初始化一個引用的聲明。

********************************************************************************

無名對象典型的三種用法: 

1 void fn(Student& s);
2 
3 void main()
4 {
5     Student& refs = Student("A"); //左側純屬舉例,一般都是有名:refs = s;
6     Student s = Student("B"); //即Student s("B");
7     fn(Student("C"));
8 }

當main結束時,有三個無名對象,和一個s對象被析構。 

********************************************************************************

 

 

    例如,下面的代碼表達了無名對象的典型的三種用法:

void fn(Student& s);

int main()

{

    Student& refs = Student("Randy"); // 初始化引用

    Student s = Student("Jenny");     // 初始化對象定義

    fn(Student("Danny"));             // 函數參數

    return 0;

}

    主函數開始運行時,第一個執行的是拿無名對象初始化一個引用。由於是在函數內部,所以無名對象作為局部對象產生在棧空間中,從作用域上看,該引用與無名對象是相同的,它完全等價於Student refs = "Ranny";所以這種使用是多余的。

    第二個執行的是用無名對象拷貝構造一個對象s。按理說C++先調用構造函數Student(char*);創建一個無名對象,然后再調用拷貝構造函數Student(Student&);(或許是默認的)創建對象s;但是,由於是用無名對象去拷貝創建一個對象,拷貝完后,無名對象就失去了任何作用,對於這種情況,C++特別將其看作為Student s = "Jenny";效果一樣,而且可以省略創建無名對象這一步。

    第三個執行的是無名對象作為實參傳遞給形參s,C++先調用構造函數創建一個無名對象,然后該無名對象初始化了引用形參s對象,由於實參是在主函數中,所以無名對象是在主函數的棧區中創建,函數fn()的形參s引用的是主函數棧空間中的一個對象。它等價於:

Student s("Danny");

fn(s);

    如果對象s僅僅是為了充當函數fn()實參的需要,完全可以用第三個執行來代替。

    當運行到主函數結束的時候,將有一個主函數中的s對象和3個無名對象被析構。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM