感謝@陽一指 和@你好我叫孫策 的評論,四年后再更新,更正一些錯誤,免得誤人子弟……
在不考慮用new動態創建對象的情況下,用最普通的
類名 對象名(參數);
的方法創建對象
先貼上最正常最普通的代碼
#include<iostream> using namespace std; class C{ public: C(){ cout<<"Hello C++\n"; }; C(int m){ cout<<"I love C++\n"; }; private: int n; }; int main(){ C c; return 0; }
OK,現在我們看看運行結果:
OK,預期地運行了第一個構造函數。但如果我們在創建對象時不用原來的句子:
C c;
而是在對象名后面加():
C c();
那會成怎樣呢?
修改后代碼:
#include<iostream> using namespace std; class C{ public: C(){ cout<<"Hello C++\n"; }; C(int m){ cout<<"I love C++\n"; }; private: int n; }; int main(){ C c(); return 0; }
沒有運行構造函數!也就是說根本就沒有在內存中創建對象,只是創建了一個“對象名”!只聲明了對象,並沒有實例化
如果創建時給它賦一個參數:
#include<iostream> using namespace std; class C{ public: C(){ cout<<"Hello C++\n"; }; C(int m){ cout<<"I love C++\n"; }; private: int n; }; int main(){ C c(1); return 0; }
OK,一切正常。
所以,現在問題就很清楚了,當我們以以下形式創建類對象時:
i)類名 對象名
默認調用“對象名()”這個構造函數,在棧內存中存在對象名,在堆內存中存在實際對象;在棧內存中實例化對象;
ii)類名 對象名(一個或以上個參數)
默認調用相應的構造函數,在棧內存中存在對象名,在堆內存中也是存在實際對象的;在棧內存中實例化對象;
iii)類名 對象名()
不調用任何構造函數創建對象,僅在棧內在中存在對象名,在堆內存中並不存在實際的對象;僅聲明對象,不在棧內存中實例化