[菜鸟]C++建立类对象时(无参)后不加括号与加括号的区别

在不考虑用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)类名 对象名()

不调用任何构造函数建立对象,仅在栈内在中存在对象名,在堆内存中并不存在实际的对象;

相关文章
相关标签/搜索