1樓:亥凝思
你用的vc++編譯的吧?vc的特點就是對於指標,如果沒顯示的初始化為null, 會預設指向位址為cccccccc 的記憶體,你換成別的編譯器實施就知道。
c++中,如果建構函式沒有預設值,物件也沒有引數賦值過去,那麼定義類的物件,呼叫建構函式時會出錯嗎
2樓:影者東昇
不會的。
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)
// 等號運算子過載
// 注意,這個類似複製建構函式,將=右邊的本類物件的值複製給等號左邊的物件,它不屬於建構函式,等號左右兩邊的物件必須已經被建立
// 若沒有顯示的寫=運算子過載,則系統也會建立乙個預設的=運算子過載,只做一些基本的拷貝工作
// 複製等號右邊的成員到左邊的物件中
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()
3樓:
我來告訴你吧,那個最佳答案就是瞎扯一些沒用的,你問的問題,分情況來看,如果你是在main函式中定義類的物件和呼叫建構函式肯定行不通,你自己用vc試試就知道了,而如果是在另乙個類中定義,舉個簡單的例子class b
class a
這樣的話就可以直接對b類物件進行定義,只需在類a的建構函式中給b物件賦值就能用了。
C 中的建構函式問題,c 建構函式的問題
建構函式一般用來對類中的資料成員進行初始化工作,但並不是要對全部資料初始化,你只需要選擇自己需要的資料進行賦值即可。其實這一點從預設的建構函式也能看出來 當你沒有顯示的寫乙個建構函式的時候,編譯器會為你提供乙個預設的建構函式,它沒有引數,只有乙個空語句,也就是說它沒有對任何資料成員進行初始化。由於構...
C 中派生類的建構函式怎麼顯式呼叫基類建構函式
子類構造的時候會自動呼叫基類的建構函式 並且是有順序的呼叫完建構函式的順序 基類 子類 子子類 不僅建構函式 析構函式也這樣 子類物件析構時自動呼叫基類的析構函式順序與建構函式順序相反 子類.基類 關於顯示呼叫基類的建構函式,是不可行的。必須用初始化表的形式呼叫基類建構函式,才能正確的把子類繼承下來...
關於C 子類建構函式的過載問題
因為你的基類student裡定義了建構函式,基類的預設建構函式不能呼叫。繼承類裡也就不可能使用預設建構函式了。把你基類裡的建構函式改為有預設值的建構函式,就能解決你的問題。如下 include stdafx.h include include using namespace std class st...