国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++篇----構(gòu)造函數(shù)和析構(gòu)函數(shù)

這篇具有很好參考價值的文章主要介紹了C++篇----構(gòu)造函數(shù)和析構(gòu)函數(shù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在很多時候,當寫了初始化,動態(tài)開辟的,需要寫銷毀函數(shù),寫了銷毀函數(shù)之后,但是卻忘記了調(diào)用這些函數(shù),忘記調(diào)用初始化函數(shù)還好,編譯器會報錯,但是如果是忘記調(diào)用銷毀函數(shù),那么編譯器是不會報錯,但是不能說這個程序就沒錯哦了,反而有很大的問題,存在內(nèi)存泄漏的問題,如和解決這樣問題?這也是本文重點。C++增加了類的6個默認成員函數(shù),本文先分享構(gòu)造函數(shù)和析構(gòu)函數(shù)。
構(gòu)造函數(shù)–主要完成初始化工作,
析構(gòu)函數(shù)–主要完成清理工作


一、前言

在很多時候,當寫了初始化,動態(tài)開辟的,需要寫銷毀函數(shù),寫了銷毀函數(shù)之后,但是卻忘記了調(diào)用這些函數(shù),忘記調(diào)用初始化函數(shù)還好,編譯器會報錯,但是如果是忘記調(diào)用銷毀函數(shù),那么編譯器是不會報錯,但是不能說這個程序就沒錯哦了,反而有很大的問題,存在內(nèi)存泄漏的問題,如和解決這樣問題?這也是本文重點。C++增加了類的6個默認成員函數(shù),本文先分享構(gòu)造函數(shù)和析構(gòu)函數(shù)。

構(gòu)造函數(shù)–主要完成初始化工作
析構(gòu)函數(shù)–主要完成清理工作

二、構(gòu)造函數(shù)

構(gòu)造函數(shù)是特殊的成員函數(shù),雖然它的名字叫構(gòu)造函數(shù),但是它的主要任務不是開空間創(chuàng)建對象,而是初始化對象
特性:
1、函數(shù)名和類名相同。 如:類名Stack,那么構(gòu)造函數(shù)的函數(shù),名也為Stack
2、無返回值(也不需要void)。
3、對象實例化編譯器自動調(diào)用對應的構(gòu)造函數(shù)。對象在定義之后就會調(diào)用它的默認構(gòu)造函數(shù)
4、構(gòu)造函數(shù)可以重載。(構(gòu)造函數(shù)雖然沒有返回值,但是可以有參數(shù))
5、如果類中沒有顯式定義構(gòu)造函數(shù),則c++編譯器會自動生成一個無參的默認構(gòu)造函數(shù),一旦用戶顯式定義,編譯器不再默認生成。

以日期類帶大家了解

#include<iostream>
using namespace std;

class Date
{
public:
	Date(int year=2022, int month=4, int day=24)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	void Print()
	{
		cout << _year << '-' << _month << '-' << _day << endl;
	}

	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	d1.Print();
	return 0;
}

C++篇----構(gòu)造函數(shù)和析構(gòu)函數(shù)

在對象定義之后并沒有顯式調(diào)用構(gòu)造函數(shù),但是在打印這個對象的時候卻是有內(nèi)容的,因為在對象定義時編譯器自動調(diào)用它的默認構(gòu)造函數(shù),(默認構(gòu)造函數(shù)是構(gòu)造函數(shù)參數(shù)列表全缺?。?br>C++篇----構(gòu)造函數(shù)和析構(gòu)函數(shù)
C++篇----構(gòu)造函數(shù)和析構(gòu)函數(shù)
構(gòu)造函數(shù)是沒有返回值的,且它的函數(shù)名與類名相同,它還能有參數(shù)也可以沒有參數(shù)
無參和參數(shù)列表全給缺省值這兩個函數(shù)在同一個類中只能出現(xiàn)其中之一

構(gòu)造函數(shù)支持重載
C++篇----構(gòu)造函數(shù)和析構(gòu)函數(shù)
對重載構(gòu)造函數(shù)的調(diào)用
C++篇----構(gòu)造函數(shù)和析構(gòu)函數(shù)

當構(gòu)造函數(shù)重載,一個構(gòu)造函數(shù)無參數(shù),一個構(gòu)造函數(shù)參數(shù)列表全給缺省值,對象定義之后自動調(diào)用它的默認構(gòu)造函數(shù),編譯器不知道調(diào)用誰,此時會發(fā)生調(diào)用歧義,所以得出,構(gòu)造函數(shù)無參數(shù)和參數(shù)列表全給缺省值這兩個在一個類中只能出現(xiàn)其中之一,一個出現(xiàn)另一個就不能出現(xiàn)。

構(gòu)造函數(shù)參數(shù)列表全為缺省參數(shù)或者無參時,在對象定以之后會自動調(diào)用,那么如果構(gòu)造函數(shù)參數(shù)列表不權(quán)威缺省參數(shù)或者不為缺省參數(shù)時,應當如何?

當構(gòu)造函數(shù)參數(shù)列表不全是缺省值時

C++篇----構(gòu)造函數(shù)和析構(gòu)函數(shù)
此時會顯示d1這個對象并不存在默認構(gòu)造函數(shù),在定義之后不能自動調(diào)用它的構(gòu)造函數(shù)了
那么在定義對象時就不能簡簡單單的定義了 而是對象+參數(shù)列表,此時編譯器才會自動調(diào)用構(gòu)造函數(shù)C++篇----構(gòu)造函數(shù)和析構(gòu)函數(shù)
但是就算構(gòu)造函數(shù)參數(shù)列表全為缺省參數(shù)或者無參,也不能像這樣
C++篇----構(gòu)造函數(shù)和析構(gòu)函數(shù)

此時編譯器并不知道這個對象是聲明還是定義

Data d1;//當構(gòu)造函數(shù)參數(shù)列表全是缺省值時,編譯器在對象實例化時才會默認自動調(diào)用構(gòu)造函數(shù),不然的話就需要對其傳參
對象+參數(shù)列表,此時就會自動調(diào)用構(gòu)造函數(shù)

構(gòu)造函數(shù):要么是無參、要么是全缺省、要么是沒有顯式寫編譯器會自動生成默認構(gòu)造函數(shù)(不傳參就可以調(diào)用的函數(shù)就是默認構(gòu)造函數(shù))

構(gòu)造函數(shù)替代了Init(初始化),可以不用調(diào)用Init也對這個對象初始化了,這樣也就解決了因沒有調(diào)用初始化帶來的錯誤,
構(gòu)造函數(shù)是給對象初始化,在對象定義時自動調(diào)用

但是如果當類中沒有定義構(gòu)造函數(shù)時,應該如何處理?

編譯器會自動生成構(gòu)造函數(shù),但是自動生成的構(gòu)造函數(shù),編譯器并沒用對類中的內(nèi)置類型成員初始化
但是也有一些編譯器會將其內(nèi)置類型成員初始化為0,不過大多數(shù)是不會處理的

內(nèi)置類型:(int/double/指針等等)
自定義類型:自己定義的/struct/class等等定義的類型

編譯器自動生成構(gòu)造函數(shù)也并不是什么都不做,當我們在類中,不顯式寫構(gòu)造函數(shù),編譯器會默認生成構(gòu)造函數(shù),類中內(nèi)置類型不做處理,自定義類型會調(diào)用它的默認構(gòu)造函數(shù)

以日期類中字自定義一個棧對象來看

#include<iostream>
using namespace std;
class Stack
{
public:
	Stack(int capacity = 4)
	{
		_a = (int*)malloc(sizeof(int) * capacity);
		if (_a == nullptr)
		{
			perror("malloc fail\n");
			return;
		}

		_top = 0;
		_capacity = capacity;

		cout << "_top" << ' ' << "_capacity" << endl;
	}
	int _capacity;
	int* _a;
	int _top;
};


class Data
{
public:
	void Print()
	{
		cout << _year << '-' << _month << '-' << _day << endl;
	}

	int _year;
	int _month;
	int _day;

	Stack _st;
};

int main()
{
	Data d1;
	d1.Print();

	return 0;
}

C++篇----構(gòu)造函數(shù)和析構(gòu)函數(shù)

可以發(fā)現(xiàn),自動生成了默認構(gòu)造函數(shù),這里類的內(nèi)置類型成員被處理為0了,其實大多數(shù)編譯器是不會對類的內(nèi)置類型成員進行處理

當類中沒有構(gòu)造函數(shù)時,編譯器會默認自動生成構(gòu)造函數(shù) 但是并不會對類的內(nèi)置類型成員做處理(初始化)
當類中有自定義類型成員時,編譯器會默認自動調(diào)用自定義類型它的構(gòu)造函數(shù),
同時有些編譯器也會將類的內(nèi)置類型成員初始化為0,但是這只是有些編譯器,并不是全部

那么哪種類可以讓編譯器默認自動生成構(gòu)造函數(shù)哪些不能? 一般情況下,類只要有內(nèi)置類型成員,理論上不能讓編譯器默認自動生成構(gòu)造函數(shù)
一般情況下,如果類成員全是自定義類型成員,可以考慮讓編譯器默認自動生成構(gòu)造函數(shù)(兩個棧實現(xiàn)隊列)

所以在c++11標準發(fā)布,也算是為其做了一些補丁
在類中內(nèi)置類型成員在聲明的時候給缺省值,此時編譯器默認自動生成構(gòu)造函數(shù)時
這些內(nèi)置類型成員不再是隨機值,而是這些缺省值

#include<iostream>
using namespace std;
class Stack
{
public:
	Stack(int capacity = 4)
	{
		_a = (int*)malloc(sizeof(int) * capacity);
		if (_a == nullptr)
		{
			perror("malloc fail\n");
			return;
		}

		_top = 0;
		_capacity = capacity;

		cout << "_top" << ' ' << "_capacity" << endl;
	}
	int _capacity;
	int* _a;
	int _top;
};


class Data
{
public:
	
	void Print()
	{
		cout << _year << '-' << _month << '-' << _day << endl;
	}

	//可以在聲明時給其缺省值
	int _year = 1;
	int _month = 1;
	int _day = 1;

	Stack _st;
};

int main()
{
	Data d1;
	d1.Print();

	return 0;
}

C++篇----構(gòu)造函數(shù)和析構(gòu)函數(shù)

類中沒有定義構(gòu)造函數(shù),編譯器會自動生成默認構(gòu)造函數(shù),再自動調(diào)用生成的構(gòu)造函數(shù),然后此時對類的內(nèi)置類型成員給缺省值,此時就相當于是對類的內(nèi)置類型成員處理

  1. 類中沒有顯式定義構(gòu)造函數(shù),編譯器會自動生成一個無參的默認構(gòu)造函數(shù)
  2. 內(nèi)置類型成員不做處理(a 有些編譯器會處理 b.c++11標準對其縫補,聲明可以給缺省值初始化)
  3. 自定義類型成員,會自動去調(diào)用它的構(gòu)造函數(shù)

關(guān)于構(gòu)造函數(shù)
總結(jié):

  1. 一般情況下,構(gòu)造函數(shù)都需要我們自己顯式寫
  2. 內(nèi)置類型成員都有缺省值,且這些缺省值初始化符合自己要求,不用顯式寫構(gòu)造函數(shù)
  3. 類中成員全是自定義類型,且這些類型都定義默認構(gòu)造函數(shù),不用顯式寫構(gòu)造函數(shù)

三、析構(gòu)函數(shù)

析構(gòu)函數(shù)與構(gòu)造函數(shù)功能相反,它是對資源的清理,相當于銷毀函數(shù),析構(gòu)函數(shù)是在定義的對象生命周期結(jié)束時自動調(diào)用析構(gòu)函數(shù),完成對資源的清理,這樣就算忘了調(diào)用銷毀函數(shù)也不會造成內(nèi)存泄漏了

析構(gòu)函數(shù)特性:

  1. 析構(gòu)函數(shù)名是在類名前加 ~
  2. 無參數(shù),無返回值
  3. 一個類只能有一個析構(gòu)函數(shù)(不能重載,析構(gòu)函數(shù)無參數(shù)),
    若是未顯式定義,系統(tǒng)會自動生成默認析構(gòu)函數(shù)。
  4. 對象生命周期結(jié)束時,編譯器會自動調(diào)用析構(gòu)函數(shù)
    5.若是未顯式定義,系統(tǒng)會自動生成默認析構(gòu)函數(shù)(生成的默認析構(gòu)函數(shù)和自動生成的構(gòu)造函數(shù)類似(a.內(nèi)置類型成員不做處理 b.自定義類型會調(diào)用它的析構(gòu)函數(shù)))

以棧為例

#include<iostream>
using namespace std;
class Stack
{
public:
	Stack(int capacity = 4)
	{
		_a = (int*)malloc(sizeof(int) * capacity);
		if (_a == nullptr)
		{
			perror("malloc fail\n");
			return;
		}

		_top = 0;
		_capacity = capacity;

		cout << "_top=" <<_top<< ' ' << "_capacity="<<_capacity << endl;
	}

	~Stack()
	{
		free(_a);
		_a = nullptr;
		_top = 0;
		_capacity = 0;
		cout << "_top=" << _top << ' ' << "_capacity=" << _capacity << endl;
	}
	int _capacity;
	int* _a;
	int _top;
};

int main()
{
	Stack st1;

	return 0;
}

C++篇----構(gòu)造函數(shù)和析構(gòu)函數(shù)
C++篇----構(gòu)造函數(shù)和析構(gòu)函數(shù)

調(diào)試轉(zhuǎn)到反匯編,可以發(fā)現(xiàn),是在對象生命周期結(jié)束,自動調(diào)用析構(gòu)函數(shù)
類中沒有顯式寫析構(gòu)函數(shù),編譯器會自動生成一個默認析構(gòu)函數(shù),其實和構(gòu)造函數(shù)差不多

析構(gòu)函數(shù)總結(jié)

一般情況下,如果對類成員寫的是靜態(tài)的,那么就不用寫析構(gòu)函數(shù)。有動態(tài)申請資源的,就需要顯式寫析構(gòu)函數(shù)釋放資源。

類中成員沒有動態(tài)申請資源,不需要寫析構(gòu)函數(shù)
類中需要釋放資源的成員都是自定義類型,不需要寫析構(gòu)函數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-427169.html

到了這里,關(guān)于C++篇----構(gòu)造函數(shù)和析構(gòu)函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 『C++成長記』構(gòu)造函數(shù)和析構(gòu)函數(shù)

    『C++成長記』構(gòu)造函數(shù)和析構(gòu)函數(shù)

    ?? 博客主頁: 小王又困了 ?? 系列專欄: C++ ?? 人之為學,不日近則日退? ?? 感謝大家點贊??收藏?評論?? 目錄 一、類的六個個默認成員函數(shù) ??1.1認識默認成員函數(shù)? 二、構(gòu)造函數(shù) ??2.1為什么要有構(gòu)造函數(shù) ??2.2構(gòu)造函數(shù)的概念 ??2.3構(gòu)造函數(shù)的特性 ??2.4編譯器

    2024年02月05日
    瀏覽(22)
  • C++構(gòu)造函數(shù)和析構(gòu)函數(shù)(附示例代碼)

    構(gòu)造函數(shù)和析構(gòu)函數(shù)是面向?qū)ο缶幊讨械闹匾拍睿糜趧?chuàng)建和銷毀對象。 構(gòu)造函數(shù) 是一種特殊的函數(shù),它在對象被創(chuàng)建時自動調(diào)用。它的作用是初始化對象的狀態(tài),例如設(shè)置成員變量的默認值、分配資源等操作。構(gòu)造函數(shù)與類同名且沒有返回值,可以有多個重載版本,同

    2024年02月03日
    瀏覽(39)
  • 【C++雜貨鋪】構(gòu)造函數(shù)和析構(gòu)函數(shù)

    【C++雜貨鋪】構(gòu)造函數(shù)和析構(gòu)函數(shù)

    ?? 默認成員函數(shù) 用戶沒有顯式實現(xiàn),編譯器會自動生成的成員函數(shù),稱為默認成員函數(shù)。 構(gòu)造函數(shù) :完成對象的初始化工作。 析構(gòu)函數(shù) :完成對象空間的清理工作。 拷貝構(gòu)造 :使用同類對象初始化創(chuàng)建對象。 賦值重載 :把一個對象賦值給另外一個對象(該對象已存在

    2024年02月16日
    瀏覽(23)
  • 【c++】類和對象(三)構(gòu)造函數(shù)和析構(gòu)函數(shù)

    【c++】類和對象(三)構(gòu)造函數(shù)和析構(gòu)函數(shù)

    ?? 個人主頁 :Quitecoder ?? 專欄 :c++筆記倉 朋友們大家好,本篇文章我們帶來類和對象重要的部分, 構(gòu)造函數(shù)和析構(gòu)函數(shù) 如果一個類中什么成員都沒有,簡稱為空類 任何類在什么都不寫時,編譯器會自動生成以下6個默認成員函數(shù) (用戶沒有顯式實現(xiàn),編譯器會生成的成

    2024年04月12日
    瀏覽(27)
  • 【C++】類和對象(中)---構(gòu)造函數(shù)和析構(gòu)函數(shù)

    【C++】類和對象(中)---構(gòu)造函數(shù)和析構(gòu)函數(shù)

    個人主頁:平行線也會相交?? 歡迎 點贊?? 收藏? 留言? 加關(guān)注??本文由 平行線也會相交 原創(chuàng) 收錄于專欄【C++之路】?? 本專欄旨在記錄C++的學習路線,望對大家有所幫助??? 希望我們一起努力、成長,共同進步。?? 我們知道類包含成員變量和成員函數(shù),當一個類中

    2024年02月05日
    瀏覽(22)
  • C++類開發(fā)第二篇(淺析構(gòu)造函數(shù)和析構(gòu)函數(shù))

    C++類開發(fā)第二篇(淺析構(gòu)造函數(shù)和析構(gòu)函數(shù))

    構(gòu)造函數(shù)是一種特殊的成員函數(shù),用于創(chuàng)建和初始化類的對象。它的 名稱與類的名稱相同 ,沒有返回值,也不需要顯式調(diào)用。在C++中,每個類都必須至少有一個構(gòu)造函數(shù)。 當我們創(chuàng)建一個類的對象時,編譯器會自動調(diào)用構(gòu)造函數(shù)來初始化該對象的成員變量。構(gòu)造函數(shù)可以執(zhí)

    2024年02月19日
    瀏覽(30)
  • 【C++心愿便利店】No.5---構(gòu)造函數(shù)和析構(gòu)函數(shù)

    【C++心愿便利店】No.5---構(gòu)造函數(shù)和析構(gòu)函數(shù)

    ??個人主頁:@小沈YO. ??小編介紹:歡迎來到我的亂七八糟小星球?? ??專欄:C++ 心愿便利店 ??本章內(nèi)容:類和對象 記得 評論?? +點贊?? +收藏?? +關(guān)注??哦~ 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 如果一個類中什么成員都沒有,簡稱為空類。 空類中真的

    2024年02月09日
    瀏覽(25)
  • C++初階類與對象(二):詳解構(gòu)造函數(shù)和析構(gòu)函數(shù)

    C++初階類與對象(二):詳解構(gòu)造函數(shù)和析構(gòu)函數(shù)

    上次為類與對象開了一個頭:C++初階類與對象(一):學習類與對象、訪問限定符、封裝、this指針 今天就來更進一步 如果一個類中什么成員都沒有,簡稱為空類。 空類中并不是什么都沒有,任何類在什么都不寫時,編譯器會 自動生成上面6個默認成員函數(shù) 。 默認成員函數(shù)

    2024年01月19日
    瀏覽(34)
  • 【C++初階】類與對象:6個默認成員函數(shù)-----構(gòu)造函數(shù)和析構(gòu)函數(shù)

    【C++初階】類與對象:6個默認成員函數(shù)-----構(gòu)造函數(shù)和析構(gòu)函數(shù)

    ? ? 我們在寫代碼的時候經(jīng)常會忘記初始化和銷毀,C++的構(gòu)造函數(shù)和析構(gòu)函數(shù)就能避免這個問題。 默認成員函數(shù):用戶沒有顯式實現(xiàn),編譯器會生成的成員函數(shù)稱為默認成員函數(shù)。 1.構(gòu)造函數(shù)是一個特殊的成員函數(shù); 2. 名字與類名相同 ,創(chuàng)建類類型對象時由 編譯器自動調(diào)用

    2024年02月05日
    瀏覽(23)
  • 【C++】繼承 ⑦ ( 繼承中的對象模型分析 | 繼承中的構(gòu)造函數(shù)和析構(gòu)函數(shù) )

    【C++】繼承 ⑦ ( 繼承中的對象模型分析 | 繼承中的構(gòu)造函數(shù)和析構(gòu)函數(shù) )

    下面有 3 個類 , 分別是 A 類 , B 類 , C 類 ; A 類是 基類 ; B 類 公有繼承 A 類 , 并定義了新的 成員變量 y ; C 類 公有繼承 B 類 , 并定義了新的 成員變量 z ; 分別定義上述 3 個類的對象 , 上述 3 個對象的內(nèi)存模型如下 : A 類對象 objA 中有一個成員 int x , 在內(nèi)存中只有一個 int 類型的

    2024年02月08日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包