2012-01-09 121 views
0


我對C++中的代碼示例有點疑問。在C++中創建對象

vector<Cat> v; 
Cat c; 
v.push_back(c); 
Cat d = v[0]; 

在這一段代碼,有多少個對象被創建?

+6

這是功課嗎? – 2012-01-09 04:10:06

+2

你對對象的總數量感興趣嗎,或者只是'Cat'對象的數量?例如,你想計算'v'作爲一個對象,還是隻計算*'v'中的'Cat'對象? – 2012-01-09 04:12:38

+4

這是不可能說的。 Cat的默認構造函數是做什麼的?它是否構建其他對象?它可以拋出異常嗎?它可以調用'std :: exit()'嗎?那麼'Cat'拷貝構造函數呢?它有什麼作用?如何使用'std :: vector'的實現?它嘗試的任何分配可能會失敗嗎?還需要計算子對象嗎? – 2012-01-09 04:13:10

回答

1

至少有三個:

vector<Cat> v; 
Cat c; // default construction 
v.push_back(c); // copy construction of v[0] from c 
Cat d = v[0]; // copy construction of d from v[0] 

編輯:請注意,我只算Cat對象在這裏,因爲它沒有任何意義要問多少個對象創建,因爲那將是實現具體(如何std::vector實現的是什麼Cat辦......?)

1

一些記錄添加到貓的構造和測試它自己:

class Cat 
{ 
    Cat() 
    { 
    std::cout<<"Constructing a Cat"<<std::endl; 
    } 
    Cat(const Cat & cat) 
    { 
    std::cout<<"Copy Constructing a Cat"<<std::endl; 
    } 
}; 

這裏就是我得到:http://codepad.org/Pzs9kOlH

需要注意的是在一定條件下的編譯器就可以去除什麼也不做的代碼塊。所以一些副本可能會被刪除。用假想的非常積極的編譯器,它可能會注意到你的代碼沒有做任何事情,並完全剝離了任何這樣的構造。由於我的構造函數現在改變了輸出,編譯器不那麼自由地去除對它們的調用。