1. 程式人生 > >C++中類的四種建構函式

C++中類的四種建構函式



建構函式又分為4大類: 1、無引數建構函式 2、有引數建構函式 3、賦值建構函式(copy建構函式 4、預設建構函式 class test{public: test(){ m_a =1; m_b =2; cout <<"這是無引數建構函式"<< endl;} test(int a){ m_a = a; cout <<"這是有一個引數建構函式"<< endl;} test(int a,int b){ m_a = a; m_b = b; cout <<"這是有兩個引數建構函式"<< endl;} test
(const test& obj)
{ m_a = obj.m_a; m_b = obj.m_b; cout <<"這是賦值建構函式"<< endl;}private:int m_a;int m_b;}; 無參建構函式呼叫: void main(){ test t1;//此時在建立t1物件時,自動呼叫無引數建構函式} 有參建構函式的呼叫:有三種方式 void main(){//第一種:這種方法不限制引數數量 test t2(7,8); test t3(10);//第二種:使用等號賦值的方式進行初始化//只使用於一個引數的建構函式 test t4 =(5,
6,7,8);//無論括號裡面寫多少數,這個逗號表示式的值就是最後一個數
//test t4=(5, 6, 7, 8);等價於 teat t4=8;    //第三種:程式設計師手工呼叫建構函式,產生一個物件 直接用建構函式法    test t5=test(20); //產生一個匿名物件,轉成t5;,類似於賦值建構函式中的第四種} 賦值建構函式(copy建構函式):有四種方式呼叫
賦值建構函式,用一個物件去初始化另外一個物件   賦值操作和初始化是兩個不同的概念 第一種呼叫方法void main(){ test t1(4,5); test t0; t0 = t1;//用t1給t0賦值 此時沒有呼叫賦值建構函式
//賦值操作和初始化是兩個不同的概念//第一種呼叫方法 test t2 = t1;//用t1來初始化t2 此時是呼叫了賦值建構函式} 第二種呼叫方法void main(){ test t1(4,5); test t2(t1);//這種呼叫形式和複製建構函式的函式宣告更為接近//也是用t1 來初始化t2} 第三種呼叫方法 void f(test p){//當這個函式被呼叫時,由於要對形參初始化,則用實參對其初始化//此時會呼叫test類的賦值建構函式 cout <<"此處實參賦值給形參,會呼叫賦值建構函式"<< endl;}//當該函式執行完畢後,會自動析構p,呼叫解構函式void palyobj(){ test t0(1,2); test t1 = t0;//這是第一種呼叫賦值建構函式的方法 cout <<"t1已經初始化完畢"<< endl; f(t1);//實參賦值給形參時,會呼叫第三種 賦值建構函式//當該函式執行完畢以後,先析構t1,在析構t0,先定義的後析構}void main(){ palyobj(); system("pause");} 第四種呼叫方法test g(){//函式返回匿名物件 test A(2,3);return A;//return A 時編譯器執行的步驟是,先執行賦值建構函式,//將A初始化給一個匿名物件,然後再把A析構掉,只剩下匿名物件}void play2(){ test B;//若返回的匿名物件,賦值給另外一個同類型的物件,那麼匿名物件會被析構 B = g();//用匿名物件賦值給B物件,然後匿名物件析構//若返回的匿名物件,來初始化另外一個同類型的物件,//那麼匿名物件會直接轉成新的物件 test C=g(); cout <<"函式返回物件初始化另一物件,那麼匿名物件會直接轉成新的物件"<< endl;}void main(){ play2(); system("pause");} 匿名物件的去和留,主要看你怎麼接它,如果不接則直接析構,若給其他物件賦值,則賦值以後會被析構,若給其他物件初始化,則直接轉化成新的物件(此時不會再呼叫賦值建構函式)。 預設建構函式 兩個預設建構函式 1、預設無參建構函式 當類中沒有定義建構函式時,編譯器預設提供一個無參建構函式,並且其函式體為空 2、預設拷貝函式     當類中沒有定義拷貝建構函式時,編譯器預設提供一個預設拷貝建構函式,簡單的進行成員變數的值的賦值
建構函式呼叫規則: 當類中程式設計師自己定義了任何一種建構函式(有參建構函式和賦值建構函式),編譯器都不會再提供無參建構函式 就是說,如果你只定義了有參建構函式,那就不能單純的只寫 test t1;//這麼寫是會報錯的,找不到可用的建構函式,//因為此時,編譯器沒有替你自動建立一個預設得無參建構函式 建構函式又分為4大類: 1、無引數建構函式 2、有引數建構函式 3、賦值建構函式(copy建構函式 4、預設建構函式 class test{public: test(){ m_a =1; m_b =2; cout <<"這是無引數建構函式"<< endl;} test(int a){ m_a = a; cout <<"這是有一個引數建構函式"<< endl;} test(int a,int b){ m_a = a; m_b = b; cout <<"這是有兩個引數建構函式"<< endl;} test(const test& obj){ m_a = obj.m_a; m_b = obj.m_b; cout <<"這是賦值建構函式"<< endl;}private:int m_a;int m_b;}; 無參建構函式呼叫: void main(){ test t1;//此時在建立t1物件時,自動呼叫無引數建構函式} 有參建構函式的呼叫:有三種方式 void main(){//第一種:這種方法不限制引數數量

相關推薦

淺談C++的幾建構函式

3月中旬參加宣講會,做了X軟公司的C++筆試題,裡面有一道“預設拷貝建構函式的題”,由於好久沒複習C++基礎知識,當時連基本的概念都想不來了了。於是乎,開始拿起以前看的譚浩強C++複習起來,現在書快要要啃完了,覺得收穫頗多。好比練武功,祕籍雖然重要,但更重要的還

C++的幾建構函式

看了大神的部落格,感覺很厲害,果斷轉了 C++中的建構函式 C++中的建構函式可以分為4類: (1)預設建構函式。以Student類為例,預設建構函式的原型為 Student();//沒有引數 (2)初始化建構函式 Student(int num,int age)

C++的拷貝建構函式的引數型別必須是引用解惑。

     在C++中, 建構函式,拷貝建構函式,解構函式和賦值函式(賦值運算子過載)是最基本不過的需要掌握的知識。 但是如果我問你“拷貝建構函式的引數為什麼必須使用引用型別?”這個問題, 你會怎麼回答? 或許你會回答為了減少一次記憶體拷貝? 很慚愧的是,我的第一感覺也是這麼回

C++建構函式

建構函式又分為4大類: 1、無引數建構函式 2、有引數建構函式 3、賦值建構函式(copy建構函式) 4、預設建構函式 class test{public: test(){ m_a =1

C++的建構函式

預設建構函式和初始化建構函式: 拷貝建構函式:複製建構函式用於複製本類的物件。 預設複製建構函式: Student(Student &b) { this.x=b.x; this.y=b.y; } 將一個已存在的物件b,賦值給呼叫該複製建構函式的物

C++struct也有建構函式與解構函式,也可以有訪問型別控制以及結構體大小,大小

C++中struct也有建構函式與解構函式,也可以有訪問型別控制,可以用private關鍵字。如下所示: #include <iostream> struct point { public: point():x_(0.0),y_(0.0

CsharpThread的建構函式

帶引數的建構函式 第一種:Thread(ParameterizedThreadStart) private void treeView1_NodeMouseClick() { try {

1、【C++】&物件/建構函式/拷貝建構函式/操作符過載/解構函式

一、C++類 & 物件     C++ 在 C 語言的基礎上增加了面向物件程式設計,C++ 支援面向物件程式設計。類是 C++ 的核心特性,通常被稱為使用者定義的型別。     類用於指定物件的形式,它包含了資料表示法和用於處理資料的方法。類中的資料和方法稱為類的成員。函式在

c++物件直接作為函式引數所引起的問題。

這兩天在寫一個視訊轉換的程式,將H263/264編碼的視訊封裝成mov格式,用c++實現。 Wiki上說Apple的mov格式是典型的over engineering,設計的非常複雜,各種資訊使用atom原子封裝,一個atom裡面遞迴地巢狀著另外一個atom,atom的種類

C++的顯式建構函式

    有如下一個簡單的複數類: class ClxComplex{public:    ClxComplex(double dReal =0.0, double dImage =0.0) { m_dReal = dReal; dImage = dImage; }    d

C++強制型別轉換的區別

使用標準C++的型別轉換符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。 1 static_cast 用法:static_cast < type-id > ( expression

C++如何在一個建構函式呼叫另一個建構函式

http://blog.chinaunix.net/uid-23741326-id-3385581.html 在C++中,一個類的建構函式沒法直接呼叫另一個建構函式,比如: 點選(此處)摺疊或開啟 #ifndef _A_H_ #define _A_H_ #i

C++強轉型別

在C++中一共有四種強轉型別分別為:static_cast,const_cast,reinterpret_cast和dynamic_cast 型別轉換的一般形式為:cast-name<type&

c++編寫String的建構函式、解構函式和賦值函式

C++程式碼  按 Ctrl+C 複製程式碼 class String { public: String(const char *str = NULL);// 普通建構函式 String(const String &other);

關於QT/C++explicit關鍵字和建構函式的*parent引數的簡單說明

文章僅僅是用來說明一下一個引數的作用  程式寫的多了,你會發現幾乎所有的Qt類的建構函式都會有一個parent引數。這個引數通常是QObject* 或者是 QWidget* 型別的(定義新的類是通常首先初始化為0,在類的實現函式中賦值)。很多情況下它都會有一個初始值0,因此,即便你不去給它複製也沒有絲毫的問

c++的預設個成員函式介紹(建構函式+拷貝構造+解構函式+賦值運算子過載函式

在C++中,類的6個預設的成員函式包括: 建構函式、解構函式、拷貝建構函式、賦值運算子過載函式、取地址操作符過載、const修飾的取地址操作符過載。 本文將主要介紹前四個成員函式: 一、建構函式 在c++程式中,物件的初始化時一個不可缺少且十分重要的

C++建構函式與複製建構函式

1 相關定義 1.1 建構函式 建構函式是類的特殊的成員函式,只要建立類型別的新物件,都要執行建構函式。建構函式的工作是保證每個物件的資料成員具有合適的初始值。建構函式的名字與類的名字相同,並且不能指定返回型別。像其他任何函式一樣,它們可以沒有形參,也可以定義多個形參。 1

C++的組合與建構函式

首先看看建構函式的概念。在程式執行過程中,當遇到物件宣告語句時,程式會想作業系統申請一定的記憶體空間用於存放新建的物件。而編譯器不知道如何產生程式碼來實現初始化。所以C++做了一套物件初始化的機制,就是建構函式。 然後是類的組合中,當建立類的物件時,如果這個類

C++建構函式

建構函式: 1.定義:是一個特殊的成員函式,名字與類名相同,建立類型別物件時,由編譯器自動呼叫,在物件的生命週期內只且只調用一次,以保證每個資料成員都有一個合適的初值。如: class Data { public: Data(int year,int month,int

C++】三呼叫的複製建構函式的情況

用類的一個物件初始化同類的另一個物件時。 某函式的返回值是類的物件,呼叫該函式時。 某函式的形參是類的物件,呼叫該函式時。 ※注意區分“初始化”和“賦值”: ClassName c2 = c1;    (初始化語句) ClassName c1 , c2;