構造函數的理解和應用場景

    最近對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時,會調用拷貝構造函數
}

 最後但願能對你們有幫助,沙米才疏學淺,有什麼錯誤請留言指正,謝謝你們。

相關文章
相關標籤/搜索