亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++超詳細講解構造函數(shù)與析構函數(shù)的用法及實現(xiàn)

 更新時間:2022年05月27日 10:15:39   作者:對象new不出來  
構造函數(shù)主要作用在于創(chuàng)建對象時為對象的成員屬性賦值,構造函數(shù)由編譯器自動調(diào)用,無須手動調(diào)用;析構函數(shù)主要作用在于對象銷毀前系統(tǒng)自動調(diào)用,執(zhí)行一?些清理工作

寫在前面

上一節(jié)解決了類與對象封裝的問題,這一節(jié)就是對象的初始化和清理的構造函數(shù)與析構函數(shù)的內(nèi)容了;對象的初始化和清理也是兩個非常重要的安全問題:一個對象或者變量沒有初始狀態(tài),對其使用后果是未知,同樣的使用完一個對象或變量,沒有及時清理,也會造成一定的安全問題;c++利用了構造函數(shù)和析構函數(shù)解決上述問題,這兩個函數(shù)將會被編譯器自動調(diào)用,完成對象初始化和清理工作。對象的初始化和清理工作是編譯器強制要我們做的事情,因此如果我們不提供構造和析構,編譯器提供編譯器提供的構造函數(shù)和析構函數(shù)是空實現(xiàn)。下面開始正文:

構造函數(shù)和析構函數(shù)

語法

構造函數(shù)語法: 類名(){}

1、沒有返回值也不寫void

2、函數(shù)名稱與類名相同

3、構造函數(shù)可以有參數(shù),因此可以發(fā)生重載

4、程序在調(diào)用對象時會自動調(diào)用,無需手動調(diào)用且只會調(diào)用一次

析造函數(shù)語法: ~類名(){}

1、沒有返回值也不寫void

2、函數(shù)名稱與類名相同,在名稱前加上符號~

3、構造函數(shù)不可以有參數(shù),因此不可以發(fā)生重載

4、程序在對象銷毀前會自動調(diào)用析構,無需手動調(diào)用且只會調(diào)用一次

作用

構造函數(shù) 主要作用于創(chuàng)建對象時為對象的成員屬性賦值,構造函數(shù)由編譯器自動調(diào)用,無須手動調(diào)用

析構函數(shù) 主要作用于對象銷毀前系統(tǒng)自動調(diào)用,執(zhí)行一些清理工作

代碼實現(xiàn)

#include<iostream>
using namespace std;
class Person
{
public:
	Person()
	{
		cout << "Person構造函數(shù)的調(diào)用" << endl;
	}
	~Person()
	{
		cout << "~Person析構函數(shù)的調(diào)用" << endl;
	}
};
void test01()
{
	Person p;//棧上的對象運行完畢后,編譯器自動釋放
}
int main()
{
	test01();
}

test01中創(chuàng)建了Person類p,主函數(shù)只是調(diào)用了一下創(chuàng)建的Person類p,編譯器就自動調(diào)用了類的構造函數(shù)和析構函數(shù),析構函數(shù)是程序運行完畢后,編譯器自動清理內(nèi)存空間的時候調(diào)用的。

兩大分類方式

按參數(shù)分為 有參構造 和 無參構造

按類型分為 普通構造 和 拷貝構造

無參和有參構造很好理解,就是有無參數(shù)的區(qū)別,這里講一下拷貝構造函數(shù):

//拷貝構造函數(shù)
	Person(const Person &p) //格式: const 類名 引用(&)變量名
	{
		//講傳入的人身上的所有屬性,拷貝到我身上
		age = p.age;
		cout << "Person的拷貝構造函數(shù)調(diào)用" << endl;
	}

Person()的括號中是const Person &p,這是拷貝構造的函數(shù)格式,他需要傳入相同類的對象,會產(chǎn)生一個具有相同屬性的類,比如p1的年齡為20,經(jīng)過拷貝構造p2的年齡也會是20,但是兩個類對象的地址并不相同,這個到后面會具體解釋

三種調(diào)用方式

class Person
{
public:
	//構造函數(shù)
	Person()
	{
		cout << "Person的無參構造函數(shù)調(diào)用" << endl;
	}
	Person(int a)
	{
		age = a;
		cout << "Person的有參構造函數(shù)調(diào)用" << endl;
	}
	//拷貝構造函數(shù)
	Person(const Person &p) //格式: const 類名 引用(&)變量名
	{
		//講傳入的人身上的所有屬性,拷貝到我身上
		age = p.age;
		cout << "Person的拷貝構造函數(shù)調(diào)用" << endl;
	}
	~Person()
	{
		cout << "~Person的析構函數(shù)調(diào)用" << endl;
	}
	int age;
};

括號法

    Person p;//默認構造函數(shù)調(diào)用
	Person p2(10);//有參構造函數(shù)
	Person p3(p2);//拷貝構造函數(shù)
	cout << "p2 age=" << p2.age << endl;
	cout << "p3 age=" << p3.age << endl;

注意事項:調(diào)用默認構造函數(shù)的時候,不要加();Person p1() 編譯器會認為是函數(shù)的聲明,不認為在創(chuàng)建對象,等同于 void func()

顯示法

    Person p;
	Person p2=Person(10);//有參構造函數(shù)
	Person p3=Person(p2);//拷貝構造函數(shù)
	Person(100);//匿名對象,特點:當前執(zhí)行完畢后,系統(tǒng)會立即回收掉匿名對象
	cout << "AAAAA" << endl;

注意事項2:拷貝構造初始化匿名對象等同于去掉括號,導致重定義,不要用拷貝構造初始化匿名對象,如果利用匿名對象的話,會和Peron p2=Person(10),重復,出現(xiàn)重定義錯誤;也不要用拷貝構造初始化匿名對象。

隱式轉換法

    Person p2 = 10;// 有參構造函數(shù)
	Person p3 = p2;// 拷貝構造函數(shù)

這個方法不推薦使用,調(diào)用的很不明顯,建議使用前面兩個方法調(diào)用構造函數(shù)。

正確調(diào)用拷貝構造函數(shù)

class Person
{
public:
	Person()
	{
		cout << "Person的無參構造函數(shù)調(diào)用" << endl;
	}
	Person(int a)
	{
		m_age = a;
		cout << "Person的有參構造函數(shù)調(diào)用" << endl;
	}
	Person(const Person& p)
	{
		m_age = p.m_age;
		cout << "Person的拷貝構造函數(shù)調(diào)用" << endl;
	}
	~Person()
	{
		cout << "Person 的析構函數(shù)調(diào)用" << endl;
	}
	int m_age;
};

正常調(diào)用

void test01()
{
	Person p1(20);
	Person p2(p1);
	cout << "p2的年齡為:" << p2.m_age << endl;
}

主函數(shù)中直接調(diào)用test01,這時候會顯示 p2的年齡為20,并且打?。嚎截悩嬙旌瘮?shù)的調(diào)用。所以說,使用一個已經(jīng)創(chuàng)建完畢的對象來初始化一個新對象的時候會調(diào)用拷貝構造函數(shù)

值傳遞的方式給函數(shù)參數(shù)傳值

void doWork(Person p)
{  }
void test02()
{
	Person p;
	doWork(p);
}

大家可以猜一下,在主函數(shù)調(diào)用,會運行出什么結果,答案是:無參構造函數(shù)調(diào)用和拷貝構造函數(shù)調(diào)用,最后是兩個析構函數(shù)調(diào)用;淺析一下過程,調(diào)用test02時創(chuàng)建了對象P,所以自動調(diào)用無參構造函數(shù),當運行到doWork(p)時,調(diào)用拷貝構造函數(shù),隨后拷貝構造函數(shù)被清理,調(diào)用析構函數(shù),程序結束前,p被清理,再次調(diào)用析構函數(shù),程序結束。

值傳遞方式返回局部對象

Person doWork2()
{
	Person p1;
	cout << (int)&p1<<"  1  " << endl;
	return p1;//返回就拷貝構造函數(shù),隨后釋放掉,調(diào)用析構
}
void test03()
{
	Person p = doWork2();//重新創(chuàng)建局部對象,并不是上面返回的對象p1
	cout << (int)&p<<"  2  " << endl;
}

這里doWork2返回值時Person類型,也就是說return p1后會拷貝構造其屬性給test03調(diào)用的p,但是p1和p2并不是同一個對象,我們可以輸出他們的地址來驗證。

這里的調(diào)用順序是:Person P1 的無參構造,隨后輸出p1地址,然后返回值的時候先調(diào)用拷貝構造函數(shù),把值賦給p,隨后清理p1調(diào)用析構;然后回到test03中,輸出p的地址,程序結束前調(diào)用析構,程序結束。

構造函數(shù)的調(diào)用規(guī)則

編譯器提供:

1、創(chuàng)建一個類,c++編譯器會給每個類都至少添加三個函數(shù)

  1. 默認構造(空實現(xiàn))
  2. 析構函數(shù)(空實現(xiàn))
  3. 值拷貝構造(值拷貝)

2、如果我們寫了有參構造,編譯器不再提供默認構造,但是提供值拷貝構造

如果我們寫了拷貝構造函數(shù),編譯器不再提供其他普通構造函數(shù)

void test01()
{
	Person p1;
	p1.m_age = 19;
	Person p2(p1);//即使沒寫拷貝構造仍然能得到結果p2.m_age =19
	cout << "p2的年齡為:" << p2.m_age << endl;
}

也就是說,就算我們不寫無參和拷貝構造,調(diào)用test03也會得到值拷貝后的p2年齡,這是編譯器默認提供的三個函數(shù)。但是如果寫了有參構造,Person p1這行代碼就會報錯,提示找不到默認構造函數(shù);同樣的如果自己寫了拷貝構造,Person p1也會顯示同樣的錯誤。

總結

這篇博文講了一部分對象的初始化和清理的內(nèi)容,著重講了構造函數(shù)的調(diào)用方法、規(guī)則,以及拷貝構造函數(shù)的概念,調(diào)用方法和細節(jié)。下一篇直接準備深淺拷貝的內(nèi)容和初始化列表,靜態(tài)成員等的問題,徹底結束對象的初始化和清理內(nèi)容,期待下篇與你們見面!

到此這篇關于C++超詳細講解構造函數(shù)與析構函數(shù)的用法及實現(xiàn)的文章就介紹到這了,更多相關C++構造函數(shù)與析構函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++實現(xiàn)讀寫ini配置文件的示例代碼

    C++實現(xiàn)讀寫ini配置文件的示例代碼

    配置文件的讀取是每個程序必備的功能,配置文件的格式多種多樣,例如:ini格式、json格式、xml格式等。其中屬ini格式最為簡單,且應用廣泛。本文和大家分享了C++讀寫ini配置文件的方法,需要的可以參考一下
    2023-05-05
  • 淺析C++中的函數(shù)與指針

    淺析C++中的函數(shù)與指針

    這篇文章主要介紹了淺析C++中的函數(shù)與指針,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • C語言制作掃雷游戲(圖形庫)

    C語言制作掃雷游戲(圖形庫)

    這篇文章主要為大家詳細介紹了C語言制作掃雷游戲,結合圖形庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語言高斯消元法的使用詳解

    C語言高斯消元法的使用詳解

    本篇文章是對C語言中高斯消元法的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 一道超經(jīng)典的C++結構體的題目

    一道超經(jīng)典的C++結構體的題目

    以下小編就為大家介紹一道超經(jīng)典的關于C++結構體的題目。需要的朋友可以過來參考下
    2013-09-09
  • C語言柔性數(shù)組的實現(xiàn)示例

    C語言柔性數(shù)組的實現(xiàn)示例

    柔性數(shù)組既數(shù)組大小待定的數(shù)組, C語言中結構體的最后一個元素可以是大小未知的數(shù)組,本文就來介紹一下柔性數(shù)組的用法,感興趣的可以了解一下
    2024-03-03
  • C++ 函數(shù)模板和類模板詳情

    C++ 函數(shù)模板和類模板詳情

    這篇文章主要對C++ 函數(shù)模板和類模板的相關資料的詳細介紹,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-09-09
  • QT5?Thread線程的具體實現(xiàn)

    QT5?Thread線程的具體實現(xiàn)

    本文主要介紹了QT5?Thread線程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • C語言實現(xiàn)的一個三子棋游戲詳解流程

    C語言實現(xiàn)的一個三子棋游戲詳解流程

    三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對角線連起來,相對兩邊依次擺上三個雙方棋子,只要將自己的三個棋子走成一條線,對方就算輸了
    2021-10-10
  • 一篇文章帶你入門C語言:函數(shù)

    一篇文章帶你入門C語言:函數(shù)

    這篇文章主要介紹了C語言中函數(shù)的聲明、定義及使用的入門教程,重點講述了main函數(shù)的相關知識,需要的朋友可以參考下,希望能給你帶來幫助
    2021-08-08

最新評論