类中的多种构造函数
構造函數術語:
? ??? ??? ??1. 默認構造 : 指的是沒有形參的構造函數, 由編譯器默認提供, 在某些場合編譯器需要自動調用一個類對象的構造函數時, 只能調用默認構造.例如: 子類繼承了父類,當子類對象被構造的時候, 父類 ? ? ? ? ? ? ? ? ? ? 的構造也會被自動調用,此時就只能自動調用父類的默認構造
? ? ? ? ? ? 2.默認構造函數:沒有形參,方法體也是空的,目的是構造一個對象
MyClass.h文件class MyClass{public :MyClass();}; MyClass.cpp文件#include "MyClass.h"MyClass::MyClass(){}? ? ?2. 轉換構造 : 指的是那些只有一個形參,且參數類型是非本類類型的構造函數們. 一般能夠顯式調用 (例如 `MyClass obj(5)`), 也能隱式調用: `fun(5);` fun的形參是`MyClass`類型?
MyClass.h文件class MyClass{public :MyClass(int i);MyClass(double i);private :double m_Num; }; MyClass.cpp文件#include "MyClass.h"MyClass::MyClass(int i){//構造函數中可以什么都不實現}MyClass::MyClass(double n){//構造函數中也可以實現對成員變量的賦值this->m_Num = n;} main.cpp文件int main(){//創建出MyClass的對象//方法1:MyClass myclass(5);//方法2:MyClass myClass = 5.0;//此時編譯器會將 MyClass myClass = 5.0;裝換成 MyClass myclass(5.0); return 0;}?3. 拷貝構造: 指的是只有一個形參, 且參數類型是本類類型的引用. 一般是在定義一個對象的時候, 將另一個對象作為初始值時,就會自動調用這個版本的構造函數, 一般編譯器會默認提供一個拷貝 ? ? ? ? ? ? ? ? ?構造, 默認提供的拷貝構造會將對象的內存空間進行拷貝.
MyClass.h文件class MyClass{public :MyClass();MyClass(MyClass& myclass); private:char* cStrName;}; MyClass.cpp文件#include "MyClass.h"MyClass::MyClass(MyClass& myclass){//注意:拷貝構造的形參一定要是對象的引用,如果不是引用那么就會導致拷貝構造不斷調用拷貝構造//當前就為拷貝構造函數//拷貝構造函數被調用的時機//1.當某個函數的形參是MyClass類型時//例: int FunMyClass(MyClass myclass){ }//2.當Myclass對象給另一個MyClass對象賦值時//例: MyClass myClass1;// MyClass myClass2 = myClass1;//3.當函數返回值是MyClass類型時://例: MyClass CreateMyClass(){ MyClass myClass; return myClass;}}MyClass::MyClass(){//無參構造函數}//深拷貝和淺拷貝的區別//1.一般在類中存在指針時就必須使用深拷貝MyClass::MyClass(MyClass& myClass){//淺拷貝 //僅僅進行簡單賦值,將當前指針保存的內存地址賦值給新的對象。如果此時舊對象調用析構,那么舊對象的成員變量指針指向的內存空間也會被釋放,那么這時新對象再去找該空間時就找不到,從而引發程序異常this->cStrName = myClass.cStrName;}//2.深拷貝MyClass::MyClass(MyClass& myClass){//深拷貝時對新指針一定要指向重新創建出的空間,并將舊空間的數據存入新的空間中str_name = _strdup(test.str_name);//_strdup()是string.h中的一個函數,作用是重新創建一塊內存空間,內存空間的大小就是實參的空間大小,并且將值賦值給新創建的內存空間}?類中包含有指針成員的時候, 一般就需要自己編寫拷貝構造, 實現對指針指向的內存進行拷貝的 ? ? ? ? ? ? ? ? ? ?功能. 否則默認拷貝構造是不會去拷貝指針指向的內容. (深拷貝和淺拷貝的區別)
? ??? ??? ??4. 帶參構造 : 含有兩個以上的形參的構造函數統稱帶參構造.
MyClass.h文件class MyClass{public:MyClass(int i,int j);}; MyClass.cpp文件#include "MyClass.h"MyClass::MyClass(int i ,int j){//帶參構造函數}?
總結
- 上一篇: 关于友元的使用
- 下一篇: 汇编中的通用寄存器、标志寄存器、段寄存器