1樓:影者東昇
不會的。
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()
2樓:
我來告訴你吧,那個最佳答案就是瞎扯一些沒用的,你問的問題,分情況來看,如果你是在main函式中定義類的物件和呼叫建構函式肯定行不通,你自己用vc試試就知道了,而如果是在另一個類中定義,舉個簡單的例子class b
class a
這樣的話就可以直接對b類物件進行定義,只需在類a的建構函式中給b物件賦值就能用了。
c++中為什麼基類中只有帶引數的建構函式時,派生類中一定要顯示定義建構函式,並寫出基類的建構函式及引數
3樓:匿名使用者
因為建立派
抄生類物件時要呼叫基類的bai建構函式,當基類du沒有定義構函式時就調
zhi用預設dao無引數的建構函式。當只定義了有參的建構函式時就呼叫有參的建構函式,所以當派生類沒有給基類傳遞引數時就會出現錯誤。解決方法:
可以在基類中過載一個無參建構函式,或者給有參建構函式的引數設定預設值。
4樓:匿名使用者
當你定義一個派生類抄的物件時首
襲先呼叫的是基類的
建構函式,如基類的建構函式是帶參的 在派生類建構函式的後面會有基類的建構函式的傳參 否則就會報錯 指的是呼叫基類中你定義的這個建構函式而不是預設的無參建構函式
c++中預設建構函式是public還是private的?
5樓:淚之夢幻
建構函式一律都是公有成員。系統在構造物件的時候會呼叫建構函式的,如果是私有成員的話,就無權訪問了。如果將建構函式寫在private關鍵字後面,那麼編譯時會報錯的。
建構函式 ,是一種特殊的方法。主要用來在建立物件時初始化物件, 即為物件成員變數賦初始值,總與new運算子一起使用在建立物件的語句中。特別的一個類可以有多個建構函式 ,可根據其引數個數的不同或引數型別的不同來區分它們 即建構函式的過載。
c++語言為類提供的建構函式可自動完成物件的初始化任務,全域性物件和靜態物件的建構函式在main()函式執行之前就被呼叫,區域性靜態物件的建構函式是當程式第一次執行到相應語句時才被呼叫。然而給出一個外部物件的引用性宣告時,並不呼叫相應的建構函式,因為這個外部物件只是引用在其他地方宣告的物件,並沒有真正地建立一個物件。
如果一個類中沒有定義任何的建構函式,那麼編譯器只有在以下三種情況,才會提供預設的建構函式:
1、如果類有虛擬成員函式或者虛擬繼承父類(即有虛擬基類)時;
2、如果類的基類有建構函式(可以是使用者定義的建構函式,或編譯器提供的預設建構函式);
3、在類中的所有非靜態的物件資料成員,它們對應的類中有建構函式(可以是使用者定義的建構函式,或編譯器提供的預設建構函式)。
6樓:匿名使用者
建構函式一律都是公有成員;建構函式不是不能被呼叫,而是不能被使用者呼叫。系統在構造物件的時候會呼叫建構函式的。如果是私有成員的話,就無權訪問了。
所以你可以試試,如果將建構函式寫在private關鍵字後面,那麼編譯時會報錯的。
7樓:匿名使用者
公有的,建構函式主要是用於初始化類的成員變數
c++中編譯系統自動為一個類生成預設建構函式的條件是什麼
8樓:匿名使用者
如果你沒有宣告任何建構函式,編譯器會自動為你提供一個預設建構函式。
c++中,如果建構函式沒有預設值,物件也沒有引數賦值過去,那麼定義類的物件,呼叫建構函式時會出錯嗎
9樓:匿名使用者
不會。建構函式是類的初始化。
即使沒有引數賦值過去,也會有預設值。
就如你定義
如果你寫int a=3;
a就被你初始化成3
但是如果你寫int a;
如果這時輸出a,就會輸出一個負數(如果不是全域性變數),類也同理
c++中如果定義了帶引數的建構函式,那麼在定義物件時,必須初始化嗎?
10樓:匿名使用者
是這樣的。
你定義了建構函式,系統就不會用預設的建構函式了。
**中你定義了自己的帶參建構函式,所以系統的預設建構函式就在編譯時,不會生成了。
這個就需要自己定義了。
否則的話,date a;這樣使用的時候就會報錯。
11樓:兔子和小強
定義物件的時候它會呼叫相應的建構函式初始化自己。如果沒有引數就呼叫不帶引數的建構函式。
12樓:匿名使用者
如果一個類定義中沒有建構函式,那麼編譯器會自動給這個類新增一個空參的建構函式,函式體是什麼也不做。如果你給一個類實現了建構函式,它們編譯器就不再會這個類自動新增空參的建構函式了。這時候,如果你沒有提供空參構造,這意味著這個類將不允許空參構造。
這也就是你在編譯時遇到的現象。如果你希望使用空參構造和帶參構造兩種構造方式並存,你就需要分別實現兩個建構函式,或者實現一個帶預設引數的含參構造。
13樓:開心果
當你自己定義一個建構函式的時候,編譯器就不再生成預設建構函式了,除非你自己顯式的定義,所以你如果定義了有引數的建構函式,然後卻想無引數初始化,編譯器會報錯的
簡單來說,你要麼不寫建構函式,用成員函式賦值,要麼就把有引數無引數的建構函式都顯式的定義清楚,
14樓:
這個例子中有兩個建構函式,分別是含參和不含參的。那麼在定義物件的時候不初始化也不會報錯吧。
15樓:匿名使用者
你的問題解決了,不過大家的回答還是有點問題的,都說不定義建構函式,編譯器會自動生成一個無引數的建構函式,其實這個是不對的,只是在有些情況下才會生成。具體大家可以上網找找資料看下。http:
c++中為什麼基類中只有帶引數的建構函式時,派生類中一定要顯示定義建構函式,並寫出基類的建構函式及引數
16樓:申其童迎
因為建立派生類物件時要呼叫基類的建構函式,當基類沒有定義構函式時就呼叫預設無引數的建構函式。當只定義了有參的建構函式時就呼叫有參的建構函式,所以當派生類沒有給基類傳遞引數時就會出現錯誤。解決方法:
可以在基類中過載一個無參建構函式,或者給有參建構函式的引數設定預設值。
17樓:邗芷若桐誠
你的說法本來就是不對的。其實c++無論基類和派生類總是有建構函式,當你不顯式的寫建構函式時系統自動提供預設建構函式。
你問的問題意思是:
如果基類的建構函式帶引數,那麼派生類的建構函式必須顯式的寫建構函式,給基類的建構函式的引數賦值!
基類的建構函式不帶引數時派生類的建構函式可以不有程式設計師寫出來,有系統預設提供。
c++程式設計: 定義一個名為juxing的矩形類,其中包括寬和長屬性,包括不帶引數的建構函式(構造函
18樓:匿名使用者
#include
using namespace std;
class juxing{
public:
juxing()
wid=0;
length=0;
cout<<"建構函式被呼叫" wid=w; length=l; cout<<"建構函式被呼叫"< this.length=first.length~juxing() cout<<"解構函式被呼叫"< private: int wid; int length; int main() juxing a(10,8); juxing b=a; public class employeepublic employee public employee string name 但實際當中會寫成下面這樣 public class employeepublic employee string name null c 什麼是預設建構函式?如果類只有一... 舉個例子吧 class base1 單繼承 class derived1 public base1 class base2 多繼承 class derived2 public base1,public base2 c.h class c c.cpp indlude c.h c c 建構函式實現 c ... 不能,就算中bai轉一下也不行,du因為這個zhi時候還虛擬函式表還沒有dao改寫,也就是說版純虛函權 數還沒有實現,函式指標指是空的。這是時序的問題。執行之後會報這個錯誤 libc abi.dylib pure virtual function called 1 2417 abort test而且...C作業,編寫程式定義員工類,定義預設建構函式和帶引數的建構函式
C 類繼承建構函式定義和實現怎麼寫呀
c在父類宣告純虛擬函式怎樣在父類建構函式