構造函數在哪裏c++?
c++中的構造函數是一個特殊的“MEMBER FUNCTION”,它與類的名稱相同,用於初始化對象的數據成員的一些有效值。每當創建類的對象時,它就會自動執行。適用於構造函數的唯一限製是它不能有返回類型或void。這是因為構造函數由編譯器自動調用,通常用於初始化值。編譯器通過與類名稱相同的名稱將構造函數與類的其他成員函數區分開來。ctorz是c++中構造函數的縮寫。
c++構造函數可以以與普通成員函數相同的方式定義為類,並可以訪問其任何數據成員。
- c++中的構造函數是什麼?
- c++中構造函數的類型
- 構造函數重載
- 對象數組中的構造函數
- 工作雙指針
- 使用新關鍵字
- 帶有默認實參的構造函數
- 初始化器列表
- 使用構造函數動態初始化
- c++中的構造函數faq
c++語法中的構造函數
在類主體內部定義構造函數的語法如下:
class CLASSNAME {......... public: CLASSNAME([parameter_list]) //構造函數定義{....... class CLASSNAME {......... public: CLASSNAME([parameter_list]} . . . . . . . .};
您還可以在類主體中定義一個構造函數,並使用它的聲明來查看下麵的內容。
class CLASSNAME {. . . . . . . .//構造函數聲明. . . . . . . . . . public: CLASSNAME ([parameter_list])};CLASSNAME::CLASSNAME([parameter_list])//構造函數定義{. . . . . . . . . . .}
- 上麵的語法顯示了構造函數的聲明和定義。它在類外部定義的方式與使用作用域解析操作符在類外部定義成員函數的方式相同。
- 應該注意,構造函數的名稱與其類的名稱相同。方括號內的構造函數形參列表是可選的,可以包含零個或多個形參。
- 應該在類的公共部分聲明構造函數,因為在創建對象時將自動調用它們。
通過示例的幫助,我們將在本文中了解c++構造函數及其類型。
在創建對象時,會立即調用一種稱為構造函數的特定類型的成員函數。
c++中的構造函數沒有返回類型,並與類共享相同的名稱。例如,
class Table{Public: Table(){}};
在這裏,Table類的構造函數稱為Table()。請注意,構造函數。
- 構造函數與類具有相同的名稱。
- 構造函數沒有返回類型和
- 構造函數是公共
c++中構造函數的類型
c++中有三種類型的構造函數,它們是:
- 默認構造函數
- 參數化構造函數
- 拷貝構造函數
默認構造函數
沒有傳入參數的構造函數稱為默認構造函數。它也被稱為不帶參數的構造函數。
構造函數是類函數,在產生類對象的新實例時調用它。構造函數與類共享相同的名稱,但它們甚至沒有void作為返回類型。它們在給類變量賦初始值時非常有用。默認構造函數和參數化構造函數是構造函數的兩種主要類型。
默認構造函數不接受任何形參。如果程序員沒有顯式提供一個默認構造函數,編譯器將給出一個隱式的默認構造函數。在該場景中,變量的默認值為0。
使用默認構造函數,即使沒有顯式指定參數,也可以在其定義中將數據成員初始化為一些實際值。每次創建對象時,都會調用構造函數。如果定義對象和類而不為類定義任何構造函數。因此,在這種情況下,編譯器自動生成自己的構造函數,不帶任何形參,即默認構造函數。
這個編譯器生成一個默認構造函數,當類的任何對象被創建時,該構造函數被自動調用,但不執行任何初始化。但是,如果顯式定義默認構造函數,編譯器將不再為您生成默認構造函數。
以下是定義類構造函數時的要點:
- 構造函數的名稱與其所屬類的名稱相同。
- 如果您沒有公開提供自己的構造函數,那麼編譯器會為您生成一個默認構造函數。
- 構造函數最好用於初始化,而不是用於輸入/輸出操作。
- 構造函數可能不是靜態的。
- 構造函數也用於使用new操作符在運行時定位內存。
- 構造函數不能是虛函數。
- 每當創建類的對象時,都會重複執行構造函數。
- 在一個類中可以聲明多個構造函數,即構造函數可以重載。
默認構造函數程序
類Line {public: int大小;//默認構造函數Line() {size=30;}};int main(){//創建對象時調用默認構造函數cout<<"行大小為"<<" "<
輸出線的尺寸是30厘米
隻要創建對象,就會調用上麵代碼的構造函數來初始化它的數據成員。
在上麵的例子中,我們提供了無參數的默認構造函數Line();然而,如果我們不這樣做,編譯器將提供它來幫助初始化數據成員。
例子:
#include using namespace std;類TestDefault{私有:int num1, num2;public: TestDefault() {num1 = 10;num2 = 20;} void display() {cout<<"num1 = "<< num1 <
輸出Num1 = 10 num2 = 20
參數化構造函數
與不接受任何形參的默認構造函數不同,可以將一個或多個實參傳遞給構造函數。
可以接受實參的構造函數稱為參數化構造函數。
在集合中聲明參數化構造函數的語法:
class class_name {public: class_name(variables) //聲明參數化的構造函數。{}};
在類外部聲明參數化構造的語法:
類class_name {};class_name:: class_name() //聲明參數化構造函數。{}
c++中的複製構造函數
c++中的複製構造函數是一個構造函數,它通過使用以前創建的同類對象初始化對象來創建對象。
構造函數重載
在某些程序中,類隻有一個構造函數,或者是0、一個或多個形參。構造函數是對象初始化的關鍵。通過結合重載的特性,構造函數的機製變得更加強大。這是通過在一個稱為constructor重載的類中提供多個構造函數實現的。
c++構造函數重載示例
/ *……一個以構造函數重載..........的概念為特色的程序*/ #include using namespace std;類ABC {private: int x,y;public: ABC() //構造函數1不帶參數{x = y = 0;} ABC(int a) //構造函數2和一個參數{x = y = a;} ABC(int a,int b) //構造函數3有兩個參數{x = a;y = b;}空白顯示(){cout < < x x = " < < < < "和" < < " y = " < < y < < endl;}}; int main() { ABC cc1; //constructor 1 ABC cc2(10); //constructor 2 ABC cc3(10,20); //constructor 3 cc1.display(); cc2.display(); cc3.display(); return 0; } //end of program
輸出:X = 10 y = 0 X = 10 y = 10 X = 10 y = 2
對象數組中的構造函數
對於正在創建的類的每個對象都調用構造函數。每當定義了類對象數組時,就會為數組的每個對象調用默認構造函數。
換句話說,使用默認參數構造函數,數組的每個對象都用相同的值集初始化。
例如:
矩形r [20];
它定義了一個包含20個矩形類對象的數組。數組矩形的每個對象(元素)調用默認構造函數來初始化其數據成員。我們還可以使用參數化的構造函數顯式地初始化數組中單個對象的值,如下所示:
矩形r[3] ={矩形(5、6),矩形(7、8),矩形(5、7)};
三個對象r[0], r[1], r[2]使用帶有兩個形參的構造函數創建並初始化,因為隻傳遞兩個實參。在這裏,帶有兩個形參的構造函數稱為顯式的,用於初始化數組的各個對象。
在c++中使用參數化構造函數初始化對象的數組
定義類時,隻指定對象的規範;沒有分配內存或容量。您需要構建對象來使用類中指定的數據和訪問函數。
語法:
1 2 3
初始化對象的參數化構造函數列表的具體方法:
使用malloc():使用malloc()方法來避免調用非參數化的構造函數。c++中的“Malloc”或“內存分配”方法用於動態分配單個大內存塊的指定大小。它返回一種空指針,可以被拋出到任何類型的指針中。
#include #使用命名空間std定義p5;類Test{//私有變量int a, b;public: //參數化構造函數Test(int a, int b) {this->a = a;- > b = b;} //函數打印void print() {cout << a << " " << b << endl;}};int main(){//分配大小為N的動態數組//使用malloc() Test* arr = (Test*)malloc(sizeof(Test) * P);//調用構造函數//為數組的每個索引(int k = 0;k < P;k++) {arr[k] = Test(k, k+ 1); } // printing contents of array for (int k = 0; k < P; k++) { arr[k].print(); } return 0; }
輸出:0 1 1 2 2 3 3 4 4 5
工作雙指針
- 指向指針的指針是一組複雜的間接指針或指針鏈。指針通常保存變量的地址。當指針指向指針時,第一個指針包含第二個指針的地址,該地址指向包含實際值的位置,如下所示。
- 現在我們可以分配一些要分配的塊,因此我們必須調用參數化的構造函數,使用new關鍵字對每個索引進行初始化。
#include #使用命名空間std定義t10;類Test{//私有變量int s, t;public: //參數化構造函數Test(int s, int t): s(s), t(t){} //函數打印void print() {cout << s << " " << t << endl;}};int main(){//分配數組使用//指針到指針的概念測試** arr =新測試*[T];//調用數組的每個索引的構造函數//使用new關鍵字for (int I = 0;我< T;i++) {arr[i] = new Test(i, i+ 1);} //打印數組的內容(int I = 0;我< T; i++) { arr[i]->print(); } return 0; }
輸出:0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10
使用新關鍵字
在Heap上,new操作符表示內存分配請求。如果有足夠的內存,new操作符標識內存並將新分配和配置的內存地址返回給變量名。
這裏,點變量是信息類型指針。數據類型可以是任意類型的內置數據以及數組,也可以是任意類型的用戶定義數據,比如結構和類。
如果添加參數化構造函數,則新關鍵字需要非參數化構造函數進行動態初始化。我們會使用一個虛擬構造函數。
#include #使用命名空間std定義e15;類Test{//私有變量int m, n;public: //虛擬構造函數Test(){} //參數化構造函數Test(int m, int n) {this->m = m;——> n = n;} //函數打印void print() {cout << m << " " << n << endl;}};int main(){//分配動態數組//使用新關鍵字Test* arr = new Test[E];//調用構造函數//數組的每個索引j < E;j++) {arr[j] = Test(j, j+ 1); } // printing contents of array for (int j = 0; j < E; j++) { arr[j].print(); } return 0; }
輸出:0 11 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 11 12
帶有默認實參的構造函數
通過定義帶有默認實參的構造函數,該功能允許被調用的構造函數指定數量較少的實參,而不是傳遞構造函數中定義的所有實參。如果在對象創建過程中調用的構造函數沒有指定所有的實參,那麼省略的實參可以采用構造函數定義中指定的默認值。
但是,如果構造函數在類內部聲明並在類外部定義,則默認值將在構造函數聲明中提供,而不是在它的定義中。
當構造函數調用指定與默認實參對應的實參時,過去實參總是覆蓋默認值。
帶有默認參數的構造函數可能有助於減少類的大小,因為不需要在類中創建多個構造函數。通過將上麵的程序與前麵的複數程序進行比較,可以看出這一點。
但是,在某些情況下,如果默認實參的值可能會改變,那麼最好使用重載構造函數,而不是使用帶有默認實參的單個構造函數。
初始化器列表
c++為初始化構造函數中對象的數據成員提供了另一種語法,稱為初始化列表。帶有兩個形參的矩形構造函數可以重寫以使用初始化列表如下:矩形(int A, int b):長度(A),呼吸(b){…}
初始化列表放在形參列表和構造函數體的左大括號之間。列表以冒號(:)開始,以逗號分隔。
每個initialize子句簡單地命名數據成員,並在括號中列出用於初始化數據成員的值。
當使用範圍解析操作符在類內部聲明構造函數並在類外部定義構造函數時,則隻能在構造函數定義中指定成員初始化列表,而不能在其聲明中指定。初始化列表允許在創建數據成員時初始化數據成員,這更有效,因為在構造函數開始執行之前就已賦值。
使用構造函數動態初始化
對象創建後的數據成員可以在運行時使用構造函數初始化。這種數據成員的初始化稱為動態初始化。
動態初始化的主要優點是允許使用重載結構進行不同的初始化模式。因此,用戶可以根據需求提供不同格式的數據。
考慮一個以英尺和英寸顯示一個人的身高的例子。
指定一個人的身高的不同格式可以是5英尺,5.5英尺,並顯式指定像5英尺和8英寸。
#include #include Class height {Private: Int feet: Double inch;公共:高度(int f){英尺=f;英寸= 0.0;}高度(雙f){英尺=int(f);英寸= (f-int (f)) * 12.0;}高度(){英尺=英寸=0;}高度(int f, double in){英尺=f;英寸=;show(){}無效Cout < < "英尺= " < < < <英尺"英寸= " < < < <英寸endl;}}://類規格的結束Int main() {Clrscr(); Height h1, h2, h3;// default constructor invoked Int ht_feet; Cout<<”Enter height in term of feet only :”; Cin<>ht_fract; H2= height(ht_fract); Int ft1; Double in1; Cout<<”Enter height in terms of feet and inches : “ ; Cin>>ft1>>in1; H3 = height(ft1, in1; H1.show(); h2.show(); h3.show(); Getch(); return 0; }
輸出:僅以英尺的形式輸入高度:5以英尺的形式輸入高度:5.5以英尺和英寸的形式輸入高度:5 8英尺= 5英寸= 0英尺= 5英寸= 6英尺= 5英寸= 8
解釋:
在這個程序中,我們有四個構造函數。參數化構造函數的實參在運行時提供。用戶可以通過以下格式指定一個人的身高:
- 不指定任何高度,因此調用默認構造函數,將feet和inch分別初始化為0。
- 僅以整數形式以英尺的形式指定高度,並且對於此構造函數height(int);被調用。
- 僅以分數形式以英尺的形式指定高度,為此,使用構造函數高度(雙);被調用。
- 以英寸為單位指定高度,構造函數高度(int、雙);被調用。
構造函數height()是重載的,調用哪一個依賴於構造函數指定的參數。
至此,關於c++中的構造函數的博客就結束了。我們希望你能從中獲得一些知識。如果您希望更多地了解c++或任何其他編程語言中的構造函數等概念,您可以加入beplay2018官网偉大學習學院的免費在線課程今天。
c++中的構造函數faq
在c++中創建對象時,會立即調用一個稱為構造函數的特殊方法。通常,它用於初始化新對象的數據成員。在c++中,類或結構名作為構造函數{[本機代碼]}的名稱。在創建對象時,調用構造函數。它創建值,即為對象提供數據,這就是為什麼它被稱為構造函數{[native code]}的原因。
因為構造函數沒有返回值,所以它缺少返回類型。
以下是構造函數與常規函數之間的一些區別:
類名也用於構造函數{[本機代碼]}。
雖然複製和參數化構造函數有輸入參數,但默認構造函數沒有。
構造函數不存在返回類型。
在形成對象時,將自動調用構造函數。
它必須展示在教室的開放區域。
如果不提供對象的默認構造函數(不需要參數且主體為空),c++編譯器將創建對象的默認構造函數。
構造函數是類函數,在產生類對象的新實例時調用它。構造函數與類共享相同的名稱,但它們甚至沒有void作為返回類型。它們在給類變量賦初始值時非常有用。
默認構造函數和參數化構造函數是構造函數的兩種主要類型。這裏有一些細節。
默認的構造函數:
默認構造函數不接受任何形參。如果程序員沒有顯式提供一個默認構造函數,編譯器將給出一個隱式的默認構造函數。在該場景中,變量的默認值為0。
參數化構造函數:
在創建對象時,參數化構造函數可以接受參數來初始化它。與向常規函數添加參數類似,也向參數化構造函數{[native code]}添加參數。對參數化構造函數的隱式和顯式調用都是可能的。
默認的構造函數:
默認構造函數不接受任何形參。如果程序員沒有顯式提供一個默認構造函數,編譯器將給出一個隱式的默認構造函數。在該場景中,變量的默認值為0。
參數化構造函數:
在創建對象時,參數化構造函數可以接受參數來初始化它。與向常規函數添加參數類似,也向參數化構造函數{[native code]}添加參數。對參數化構造函數的隱式和顯式調用都是可能的。
拷貝構造函數:
複製構造函數用於在生成新對象時複製現有對象。在c++中,它是複製對象的常用方法。作為參數,它接受對同一類對象的引用。
構造函數是麵向對象編程(OOP)中的一種獨特方法。當您使用new關鍵字創建對象時,每次都會調用它。對象可以在使用收縮器創建時初始化自己,從而不需要對實例函數進行第二次調用。雖然它有技術的外表,但它與方法在以下兩個方麵有所不同。
構造函數的名稱總是與它初始化其成員的類的名稱相同。
此外,它缺少類似void的函數和返回類型。每次創建屬於類的對象時,它會觸發編譯器自動調用構造函數{[native code]}。
構造函數是c++中的一個特殊的“MEMBER FUNCTION”,與它所屬的類同名,用於為對象的數據成員初始化一些有用的值。構造函數用於初始化值,並由編譯器自動調用,這就是原因。
類的構造函數方法是構造和初始化特定於類的對象實例的特定方法。
一個稱為構造函數的特定方法生成類的實例。通常,構造函數方法接收輸入參數來初始化對象並分配屬性中包含的數據。參見創建一個簡單的類獲得一個簡單的說明。
在c++中創建類的對象時,將調用稱為構造函數的成員函數。在c++中,構造函數分為三類:默認構造函數、參數化構造函數和複製構造函數。
與函數重載類似,構造函數重載也是可能的。重載構造函數的類名是相同的,但是它們接受不同數量的形參。根據給定的參數的數量和類型調用適當的構造函數。
要用默認狀態或啟動狀態初始化對象,可以使用構造函數。原始的默認設置可能不是您想要的。利用構造函數還可以提供依賴關係的信息。