[菜鳥]C++創建類對象時(無參)后不加括號與加括號的區別


感謝@陽一指 和@你好我叫孫策 的評論,四年后再更新,更正一些錯誤,免得誤人子弟……

 

在不考慮用new動態創建對象的情況下,用最普通的

類名 對象名(參數);

的方法創建對象

先貼上最正常最普通的代碼

#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,預期地運行了第一個構造函數。但如果我們在創建對象時不用原來的句子:

C c;

而是在對象名后面加():

C c();

那會成怎樣呢?

修改后代碼:

#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)類名 對象名()

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM