在不考虑用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)类名 对象名()
不调用任何构造函数建立对象,仅在栈内在中存在对象名,在堆内存中并不存在实际的对象;