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個無名對象被析構。