在不考慮用new動態建立對象的狀況下,用最普通的ios
類名 對象名(參數);函數
的方法建立對象spa
先貼上最正常最普通的代碼3d
#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,預期地運行了第一個構造函數。但若是咱們在建立對象時不用原來的句子:blog
C c;內存
而是在對象名後面加():io
C c();class
那會成怎樣呢?stream
修改後代碼:
#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)類名 對象名()
不調用任何構造函數建立對象,僅在棧內在中存在對象名,在堆內存中並不存在實際的對象;