关于C++的构造函数的基本知识就不细讲了,可以看看之前博主发的博客。
- 使用构造函数
class A{
};
A a;
A a(1,2);//隐式 1
A a = A(1,2);//显式 2
A *pa = new A(2,3); //动态分配内存 ,也是隐式的 3
- 一个注意点
隐式调用默认构造函数时,不要使用括号。
所谓隐式地调用,就是上面的1 、3 种情况
A aa(); //这没有调用A的默认构造函数,实际上它声明了一个返回A对象的函数
A *pa = new A(); // 不过java中确实是这样的。
- 关于显式地调用构造函数
C++标准允许编译器在进行显式地调用构造函数,比如A a = A();
的时候用两种方法去实现,一种是和隐式的做法完全等价,一种是先生成一个临时对象(再删除这个“临时”对象),然后复制到左边去。
另外显式地调用构造函数不仅仅用于初始化新对象,还可以将一个新的对象赋给一个变量。
class A{
public:
int x;
A(){
x = 0 ;}
A(int x){
this->x = x; }
~A(){
cout<<"析构 x = "<<x<<endl; }
};
int main(){
// 下面两句话的含义大不相同的
A a1 = A(1);
a1 = A(9);
return 0;
}
输出
析构 x = 9 // 临时对象的析构
析构 x = 9 // a1对象的析构
- 列表初始化
c++11对列表初始化也是允许的,只要列表中的内容与某个构造函数相匹配
class A{
public:
int x, y ;
A(){
x = 0 ;}
A(int x){
this->x = x; }
A(int x,int y){
this->x = x; y = 0 }
~A(){
cout<<"析构 x = "<<x<<endl; }
};
A a1 = {
1};
A a2 {
1,2};