建構函式是用來初始化所定義的物件,如果類中沒有定義任何建構函式,則該類的對

時間 2021-06-28 17:33:20

1樓:匿名使用者

不對,c++裡不寫類的建構函式時,編譯器會為類建立一個預設的建構函式,雖然這個函式什麼都不做,但是類的物件還是會在此時初始化,不過,物件成員的值是隨機的,比如,指標型成員變數可能為null,也有可能不為null。

2樓:匿名使用者

no如果使用者不提供建構函式,那麼編譯器就會自動合成一個預設建構函式

除非自定義一個私有的建構函式,那麼就是抽象類/靜態類,不能例項化

3樓:我要不一樣的

編譯器會自動建立一個不帶引數的建構函式

4樓:匿名使用者

沒錯呀,沒有建構函式,就構造不了類了,怎麼初始化呢?

5樓:匿名使用者

如果一個類中沒有定義任何建構函式,編譯器就會自動合成一個預設建構函式,並對一些類的成員進行初始化,你可以執行一下這個程式:

雖然類y沒有定義建構函式,但其成員_x還是被初始化了,即編譯器合成的建構函式呼叫了x的建構函式,將_a初始化為33

#include

using namespace std;

class x

int _a;

};class y

;int main()

c++中,如果建構函式沒有預設值,物件也沒有引數賦值過去,那麼定義類的物件,呼叫建構函式時會出錯嗎

6樓:影者東昇

不會的。

c++類的建構函式詳解

一、 建構函式是幹什麼的

class counter

private:

// 資料成員

int m_value;

}該類物件被建立時,編譯系統物件分配記憶體空間,並自動呼叫該建構函式->由建構函式完成成員的初始化工作

eg:    counter c1;

編譯系統為物件c1的每個資料成員(m_value)分配記憶體空間,並呼叫建構函式counter( )自動地初始化物件c1的m_value值設定為0

故:建構函式的作用:初始化物件的資料成員。

二、 建構函式的種類

class complex

//    一般建構函式(也稱過載建構函式)

// 一般建構函式可以有各種引數形式,一個類可以有多個一般建構函式,前提是引數的個數或者型別不同(基於c++的過載函式原理)

// 例如:你還可以寫一個 complex( int num)的建構函式出來

// 建立物件時根據傳入的引數不同呼叫不同的建構函式

complex(double real, double imag)

//    複製建構函式(也稱為拷貝建構函式)

//    複製建構函式引數為類物件本身的引用,用於根據一個已存在的物件複製出一個新的該類的物件,一般在函式中會將已存在物件的資料成員的值複製一份到新建立的物件中

//    若沒有顯示的寫複製建構函式,則系統會預設建立一個複製建構函式,但當類中有指標成員時,由系統預設建立該複製建構函式會存在風險,具體原因請查詢 有關 “淺拷貝” 、“深拷貝”的文章論述

complex(const complex & c)

// 型別轉換建構函式,根據一個指定的型別的物件建立一個本類的物件

// 例如:下面將根據一個double型別的物件建立了一個complex物件

complex::complex(double r)

// 等號運算子過載

// 注意,這個類似複製建構函式,將=右邊的本類物件的值複製給等號左邊的物件,它不屬於建構函式,等號左右兩邊的物件必須已經被建立

// 若沒有顯示的寫=運算子過載,則系統也會建立一個預設的=運算子過載,只做一些基本的拷貝工作

complex &operator=( const complex &rhs )

// 複製等號右邊的成員到左邊的物件中

this->m_real = rhs.m_real;

this->m_imag = rhs.m_imag;

// 把等號左邊的物件再次傳出

// 目的是為了支援連等 eg:    a=b=c 系統首先執行 b=c

// 然後執行 a= ( b=c的返回值,這裡應該是複製c值後的b物件)

return *this;}};

下面使用上面定義的類物件來說明各個建構函式的用法:

void main()

7樓:

我來告訴你吧,那個最佳答案就是瞎扯一些沒用的,你問的問題,分情況來看,如果你是在main函式中定義類的物件和呼叫建構函式肯定行不通,你自己用vc試試就知道了,而如果是在另一個類中定義,舉個簡單的例子class b

class a

這樣的話就可以直接對b類物件進行定義,只需在類a的建構函式中給b物件賦值就能用了。

建構函式是用來初始化所定義的物件,如果一個類中沒有定義任何建構函式則該物件便無法初始化說法對嗎?

8樓:匿名使用者

如果一個類中沒有定義任何建構函式,編譯器就會自動合成一個預設建構函式,並對一些類的成員進行初始化,你可以執行一下這個程式:

雖然類y沒有定義建構函式,但其成員_x還是被初始化了,即編譯器合成的建構函式呼叫了x的建構函式,將_a初始化為33

#include

using namespace std;

class x

int _a;

};class y

;int main()

(c#) 什麼是預設建構函式?如果類只有一個預設建構函式,物件的例項變數是如何初始化的?

9樓:匿名使用者

預設構造還是是與類同名的函式, 物件的變數初始化直接用new+建構函式例項化.

10樓:匿名使用者

如果在一個類中沒有任何建構函式,這個類會有一個無參建構函式 public 類名(){},在例項化這個類時,程式先在記憶體的託管堆中為此類開闢一塊空間,然後建立這個類,最後於呼叫這個類的無參建構函式。

如果一個類中定義了有參建構函式,這個類就不會再產生無參建構函式了,例項化時就可以按照引數呼叫對應的建構函式。

11樓:匿名使用者

預設建構函式是不含引數的和建構函式,例項變數的初始化是定義時就自動賦值了吧,

如果是數值型的,如果不賦值的話,預設為0,其他型別預設為null

12樓:匿名使用者

預設建構函式(default constructor)就是在沒有顯式提供初始化式時呼叫的建構函式。它由不帶引數的建構函式,或者為所有的形參提供預設實參的建構函式定義。如果定義某個類的變數時沒有提供初始化式就會使用預設建構函式。

13樓:匿名使用者

開闢一個堆記憶體,先分配物件本身this指標的記憶體,然後是同步塊索引,例項變數指標。

一個類的建構函式中可以不包含對其子物件的初始化啊 5

14樓:匿名使用者

在建構函式體執行前,會執行類的初始化序列。

classa::classa()

: ... ... // 冒號後面的**就是初始化序列一般,類的成員應該在初始化序列裡顯式的初始化。

但如果你不這麼做,編譯器也會幫你呼叫這個成員所屬類的預設建構函式來初始化這個成員。

但是如果這個成員所屬的類沒有預設建構函式,那編譯就會報錯。這時你必須在成員初始化序列中顯示的初始化這個成員。

15樓:匿名使用者

不太明白你問的是什麼意思,我想你問的意思應該是“一個類的建構函式中可不可以不包含對其子物件的初始化啊?”,如果是這個意思,我想我能回答這個問題:

如果其子物件的建構函式中有引數則就必須包含對其子物件的初始化,反之,則不包含。其實,傳不傳引數取決於該物件所屬類的建構函式是否有引數,不管在哪種情況下都遵循這個規律。

16樓:匿名使用者

從語法角度來講沒有問題,但應用可能會存在問題

c++中如果定義了帶引數的建構函式,那麼在定義物件時,必須初始化嗎?

17樓:匿名使用者

是這樣的。

你定義了建構函式,系統就不會用預設的建構函式了。

**中你定義了自己的帶參建構函式,所以系統的預設建構函式就在編譯時,不會生成了。

這個就需要自己定義了。

否則的話,date a;這樣使用的時候就會報錯。

18樓:兔子和小強

定義物件的時候它會呼叫相應的建構函式初始化自己。如果沒有引數就呼叫不帶引數的建構函式。

19樓:匿名使用者

如果一個類定義中沒有建構函式,那麼編譯器會自動給這個類新增一個空參的建構函式,函式體是什麼也不做。如果你給一個類實現了建構函式,它們編譯器就不再會這個類自動新增空參的建構函式了。這時候,如果你沒有提供空參構造,這意味著這個類將不允許空參構造。

這也就是你在編譯時遇到的現象。如果你希望使用空參構造和帶參構造兩種構造方式並存,你就需要分別實現兩個建構函式,或者實現一個帶預設引數的含參構造。

20樓:開心果

當你自己定義一個建構函式的時候,編譯器就不再生成預設建構函式了,除非你自己顯式的定義,所以你如果定義了有引數的建構函式,然後卻想無引數初始化,編譯器會報錯的

簡單來說,你要麼不寫建構函式,用成員函式賦值,要麼就把有引數無引數的建構函式都顯式的定義清楚,

21樓:

這個例子中有兩個建構函式,分別是含參和不含參的。那麼在定義物件的時候不初始化也不會報錯吧。

22樓:匿名使用者

你的問題解決了,不過大家的回答還是有點問題的,都說不定義建構函式,編譯器會自動生成一個無引數的建構函式,其實這個是不對的,只是在有些情況下才會生成。具體大家可以上網找找資料看下。http:

一個自定義的類,忘了定義建構函式,還能初始化麼?

23樓:匿名使用者

一個類一定要進行初始化的啊

如果一個類中沒有定義任何的建構函式,那麼編譯器只有在以下三種情況,才會提供預設的建構函式:

1、如果類有虛擬成員函式或者虛擬繼承父類(即有虛擬基類)時;

2、如果類的基類有建構函式(可以是使用者定義的建構函式,或編譯器提供的預設建構函式);

3、在類中的所有非靜態的物件資料成員,它們對應的類中有建構函式(可以是使用者定義的建構函式,或編譯器提供的預設建構函式)。

cc通過初始化列表和建構函式內賦值初始化成員

周生 看你的成員變數型別和繼承方式了,公有成員變數和公有繼承,直接賦值就行了。私有成員變數,繼承之後要在初始化列表中初始化 初始化表的必要性 1 類中包含常量和引用型的成員變數。必須通過建構函式和初始化表顯式地對其進行初始化。2 在子類中顯式地構造其基類部分。class a a int n m n ...

C 拷貝建構函式的問題,就是用類物件初始化另類物件時,會自動呼叫建構函式

亥凝思 你用的vc 編譯的吧?vc的特點就是對於指標,如果沒顯示的初始化為null,會預設指向位址為cccccccc 的記憶體,你換成別的編譯器實施就知道。c 中,如果建構函式沒有預設值,物件也沒有引數賦值過去,那麼定義類的物件,呼叫建構函式時會出錯嗎 影者東昇 不會的。c 類的建構函式詳解 一 建...

直接初始化類,為什麼被認為是個函式

test a test 這種寫法應該是錯誤的吧,如果不是錯誤的也不應該採用 test a test 宣告了乙個函式,函式名為a,引數為乙個test型別的函式指標,返回值為test型別的變數 滿意請採納,不滿意請追問 因為c 中乙個類有乙個預設的無引數的建構函式,並且該函式名與類名相同,所以test ...