[菜鳥]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)類名 對象名()

不調用任何構造函數建立對象,僅在棧內在中存在對象名,在堆內存中並不存在實際的對象;

相關文章
相關標籤/搜索