最近對C++的構造函數作了一個小小的總結,說是C++,其實java等面向對象高級語言對構造函數處理的本質都是同樣的,只不過是有些許語法的區別罷了。java
一、 爲何須要構造函數?ios
當咱們在建立一個對象時,經常須要作一些初始化的工做,爲了解決這個問題,C++的編譯器大牛們專門爲咱們提供了構造函數來處理對象的初始化,構造函數是在咱們創建對象是,自動調用的。服務器
也能夠這樣理解,當咱們在建立遊戲角色時(建立一個對象),服務器每每會給遊戲角色一些基本的屬相和裝備(作一些初始化工做),這個是服務器自動分配給咱們的,不須要咱們作什麼,伴隨着咱們角色的建立產生的。這種默認分配能夠理解爲構造函數的做用。函數
二、定義spa
很簡單: 類名(參數){ 函數體 } 調試
注意:(1)函數名必須與類名相同 (2)沒有返回值 code
三、分類對象
默認構造函數:遊戲
1)默認無參構造函數get
當類中沒有定義構造函數時,編譯器默認提供一個無參構造函數,而且其函數體爲空
2)默認拷貝構造函數
當類中沒有定義拷貝構造函數時,編譯器默認提供一個默認拷貝構造函數,簡單的進行成員變量的值複製(淺拷貝)
也能夠這樣理解(很重要的):
沒有自定義構造函數時,C++編譯器會自動調動相應默認構造函數(無參和copy構函數)
有了自定義的無參或者普通參數構造函數時,C++編譯器將不會提供默認的無參構造函數,可是還會提供默認copy構造函數。
有了自定義的copy構造函數時,C++編譯器將不會再提供默認的copy構造函數,可是還會提供默認無參構造函數。
四、調用方式
先貼出個人Cat類:
Cat.h文件
#pragma once class Cat { private: int m_age; public: Cat(void); //無參構造函數 Cat(int age); //普通有參構造函數 Cat(Cat & cat); //copy構造函數 int getAge(); //普通成員函數(這種也可叫作獲取器) void setAge(int age); //普通成員函數(這種也可叫作設置器) ~Cat(void); };
Cat.cpp
#include "Cat.h" #include <iostream> using namespace std; //無參構造函數 Cat::Cat(void) { m_age =0; cout<<"無參構造函數進行初始化"<<endl; } //普通有參構造函數 Cat::Cat(int age) { m_age = age; cout<<"普通有參構造函數進行初始化"<<endl; } //copy構造函數 Cat::Cat(Cat & cat) { m_age = cat.getAge(); cout<<"copy構造函數進行初始化"<<endl; } //普通成員函數(這種也可叫作獲取器) int Cat::getAge() { return m_age; } //普通成員函數(這種也可叫作設置器) void Cat::setAge(int age) { m_age = age; } Cat::~Cat(void) { cout<<"此對象被析構了"<<endl; }
調用方式分兩種:一、括號法 二、等號法
代碼展現:
#include <iostream> using namespace std; #include "Cat.h" int main() { //調用無參構造函數 Cat t1; Cat t2(); Cat t3 = Cat(); //調用有參構造函數 Cat m1(22); Cat m2 = (33); Cat m3 = Cat(44); //調用copy構造函數 Cat s1; Cat n1(s1); Cat n2 = s1; Cat n3 = Cat(s1); system("pause"); }
五、深刻理解copy構造函數和匿名構造函數
(1)將實體對象作實參傳給函數
代碼以下,你們有興趣能夠斷點調試一下,就知道大致流程了。
#include <iostream> using namespace std; #include "Cat.h" void func(Cat cat) { cout<<cat.getAge()<<endl; } int main() { Cat cat1; func(cat1); //在將實參cat1初始化給形參cat時。調用形參cat的copy構造函數。 }
流程以下:
(2)將函數中的實體對象做爲函數的返回值返回
代碼以下:
#include <iostream> using namespace std; #include "Cat.h" Cat func() { Cat cat2(22); return cat2; //在return cat2時,C++編譯器會調用cat2的拷貝構造函數,生成一個匿名對象 } int main() { Cat cat1 = func(); //若是func函數的返回值要賦給的對象尚未初始化,就將func函數產生的匿名對象變成cat1 Cat cat3; cat3 = func(); //若是func函數的返回值要賦給的對象已經初始化過,就將func函數產生的匿名對象析構,將其值賦值給cat1 }
流程以下:
(3)當使用類的一個對象去初始化該類的另外一個新對象時,會調用拷貝構造函數。eg:
#include <iostream> using namespace std; #include "Cat.h" int main() { Cat cat1; Cat cat2 = cat1; //用類的對象cat1去初始化另外一個新的對象cat2時,會調用拷貝構造函數 }
最後但願能對你們有幫助,沙米才疏學淺,有什麼錯誤請留言指正,謝謝你們。