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

C++中類的6個默認成員函數(shù) 【拷貝構造函數(shù)】

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

拷貝構造函數(shù)的使用

  • 在前幾章學習對象的時候,我們有的時候需要一個與已存在對象一某一樣的新對象

  • 那在創(chuàng)建對象時,可否創(chuàng)建一個與已存在對象一某一樣的新對象呢?

  • 拷貝構造函數(shù):只有單個形參,該形參是對本類類型對象的引用(一般常用const修飾),在用已存在的類類型對象創(chuàng)建新對象時由編譯器自動調用。

拷貝構造函數(shù)也是特殊的成員函數(shù),其特征如下:

  1. 拷貝構造函數(shù)是構造函數(shù)的一個重載形式。
  2. 拷貝構造函數(shù)的參數(shù)只有一個且必須是類類型對象的引用,使用傳值方式編譯器直接報錯,因為會引發(fā)無窮遞歸調用。
class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	//Date(const Date d) // 錯誤寫法:編譯報錯,會引發(fā)無窮遞歸
	Date(const Date& d) // 必須傳引用
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1(2024,2,1);
	Date d2(d1);
	return 0;
}

C++中類的6個默認成員函數(shù) 【拷貝構造函數(shù)】,C++,c++,c

  • 下面我們解釋一下:
  • 這里的const可加可不加,但是建議加上
  • 有些人就寫這個寫昏頭了,寫反了,不加const的話不會提示

C++中類的6個默認成員函數(shù) 【拷貝構造函數(shù)】,C++,c++,c

  • 加上了就知道哪里錯了,所以還是加上較好

C++中類的6個默認成員函數(shù) 【拷貝構造函數(shù)】,C++,c++,c

  • 這里的拷貝構造必須傳引用,要不然會引發(fā)無窮遞歸【反正編譯會報錯~】

C++中類的6個默認成員函數(shù) 【拷貝構造函數(shù)】,C++,c++,c

  • 再看下面代碼,我是沒有寫拷貝構造的,但是這里自動拷貝了,畢竟這個是默認成員函數(shù),這里生成的還和之前幾個的默認成員函數(shù)還不一樣,之前的對默認成員函數(shù)對內置類型不處理,而這個拷貝構造對內置類型處理了,如果沒有處理,這里就拷貝不出來
  • 說明這里會自動生成一個拷貝構造函數(shù),將值拷貝回去
  1. 若未顯式定義,編譯器會生成默認的拷貝構造函數(shù)。 默認的拷貝構造函數(shù)對象按內存存儲按字節(jié)序完成拷貝,這種拷貝叫做淺拷貝,或者值拷貝。
class Date
{
public:
	// 構造函數(shù)
	Date(int year = 2024, int month = 2, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1(2024, 2, 1);
	Date d2(d1);
	
	d1.Print();
	d2.Print();

	return 0;
}

C++中類的6個默認成員函數(shù) 【拷貝構造函數(shù)】,C++,c++,c

拷貝構造對于自定義類型【淺拷貝】

  • 那么對于自定義類型呢?
class Time
{
public:
	Time(const Time& t)
	{
		_hour = t._hour;
		_minute = t._minute;
		_second = t._second;
		cout << "Time::Time(const Time&)" << endl;
	}
private:
	int _hour;
	int _minute;
	int _second;
};

class Date
{
public:
	Date(int year = 2024, int month = 2, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	void Print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;

	// 自定義類型
	Time _t;
};
int main()
{
	Date d1(2024,2,1);
	Date d2(d1);
	
	d1.Print();
	d2.Print();
	return 0;
}

C++中類的6個默認成員函數(shù) 【拷貝構造函數(shù)】,C++,c++,c

  • 我們有一個方法就是強制讓編譯器生成

  • 加上這一條:

Time() = default;

C++中類的6個默認成員函數(shù) 【拷貝構造函數(shù)】,C++,c++,c

深拷貝

  • 剛剛上面的一種場景叫做淺拷貝,還有一個場景就是深拷貝

  • 編譯器生成的默認拷貝構造函數(shù)已經(jīng)可以完成字節(jié)序的值拷貝了,還需要自己顯式實現(xiàn)嗎?當然像日期類這樣的類是沒必要的。那么下面的類呢?驗證一下試試?

  • 下面我這個代碼沒有寫拷貝構造,它會自動生成一個默認的值拷貝,我們來運行一下

typedef int DataType;
class Stack
{
public:
	Stack(size_t capacity = 10)
	{
		_array = (DataType*)malloc(capacity * sizeof(DataType));
		if (nullptr == _array)
		{
			perror("malloc申請空間失敗");
			return;
		}
		_size = 0;
		_capacity = capacity;
	}
	void Push(const DataType& data)
	{
		// CheckCapacity();
		_array[_size] = data;
		_size++;
	}
	~Stack()
	{
		if (_array)
		{
			free(_array);
			_array = nullptr;
			_capacity = 0;
			_size = 0;
		}
	}
private:
	DataType* _array;
	size_t _size;
	size_t _capacity;
};
int main()
{
	Stack s1;
	s1.Push(1);
	s1.Push(2);
	s1.Push(3);
	s1.Push(4);
	Stack s2(s1);
	return 0;
}
  • 我們看到程序崩潰了~~

C++中類的6個默認成員函數(shù) 【拷貝構造函數(shù)】,C++,c++,c

  • 也就是在一些場景下,默認生成的拷貝構造是會出事的

  • 再調試看一下:

C++中類的6個默認成員函數(shù) 【拷貝構造函數(shù)】,C++,c++,c

  • 這會導致兩個對象指向同一塊空間

C++中類的6個默認成員函數(shù) 【拷貝構造函數(shù)】,C++,c++,c

  • 在結束的時候會調用析構函數(shù),會把那塊空間給釋放了

C++中類的6個默認成員函數(shù) 【拷貝構造函數(shù)】,C++,c++,c

  • 再次釋放的時候會出現(xiàn)錯誤
  • 同一塊空間被釋放了兩次【所以是絕對不能的】

C++中類的6個默認成員函數(shù) 【拷貝構造函數(shù)】,C++,c++,c

  • 正確的我們這樣寫
  • 需要引入一個叫做深拷貝
Stack(const Stack& s)
{
	// 深拷貝
	DataType* tmp = (DataType*)malloc(s._capacity * sizeof(DataType));
	if (nullptr == tmp)
	{
		perror("malloc fail\n");
		exit(-1);
	}
	memcpy(tmp, s._array, sizeof(DataType) * s._size);
	_array = tmp;
	// 淺拷貝
	_size = s._size;
	_capacity = s._capacity;
}

C++中類的6個默認成員函數(shù) 【拷貝構造函數(shù)】,C++,c++,c

注意:類中如果沒有涉及資源申請時,拷貝構造函數(shù)是否寫都可以;一旦涉及到資源申請時,則拷貝構造函數(shù)是一定要寫的,否則就是淺拷貝

拷貝構造函數(shù)典型調用場景

  • 使用已存在對象創(chuàng)建新對象
  • 函數(shù)參數(shù)類型為類類型對象
  • 函數(shù)返回值類型為類類型對象
class Date
{
public:
	Date(int year, int minute, int day)
	{
		cout << "Date(int,int,int):" << this << endl;
	}
	Date(const Date& d)
	{
		cout << "Date(const Date& d):" << this << endl;
	}
	~Date()
	{
		cout << "~Date():" << this << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
Date Test(Date d)
{
	Date temp(d);
	return temp;
}
int main()
{
	Date d1(2022, 1, 13);
	Test(d1);
	return 0;
}

C++中類的6個默認成員函數(shù) 【拷貝構造函數(shù)】,C++,c++,c

  • 為了提高程序效率,一般對象傳參時,盡量使用引用類型,返回時根據(jù)實際場景,能用引用盡量使用引用。

最后本文就到這里結束了,感謝大家的收看,請多多指點~文章來源地址http://www.zghlxwxcb.cn/news/detail-830246.html

到了這里,關于C++中類的6個默認成員函數(shù) 【拷貝構造函數(shù)】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • ?【C++要笑著學】(7) 默認成員函數(shù):構造函數(shù) | 析構函數(shù) | 拷貝構造函數(shù)

    ?【C++要笑著學】(7) 默認成員函數(shù):構造函數(shù) | 析構函數(shù) | 拷貝構造函數(shù)

    ?? 訂閱量破千的火熱 C++ 教程 ?? 火速訂閱 《C++要笑著學》? ??? CSDN 累計訂閱量破千的火爆 C/C++ 教程的 2023 重制版,C 語言入門到實踐的精品級趣味教程。 了解更多: ?? ?\\\"不太正經(jīng)\\\" 的專欄介紹? ← 試讀第一章 訂閱鏈接: ?? 《C語言趣味教程》?← 猛戳訂閱! ? 本篇

    2024年02月07日
    瀏覽(39)
  • 【C++】類和對象②(類的默認成員函數(shù):構造函數(shù) | 析構函數(shù))

    【C++】類和對象②(類的默認成員函數(shù):構造函數(shù) | 析構函數(shù))

    ?? 個人主頁: Forcible Bug Maker ?? 專欄: C++ 目錄 前言 類的6個默認成員函數(shù) 構造函數(shù) 概念 構造函數(shù)的特性及用法 析構函數(shù) 概念 析構函數(shù)的特性及用法 結語 本篇主要內容:類的6個默認成員函數(shù)中的 構造函數(shù) 和 析構函數(shù) 進入到類和對象內容的第二節(jié),上篇博客中介紹了

    2024年04月16日
    瀏覽(37)
  • 【C++初階】類與對象:6大默認成員函數(shù)------拷貝構造和賦值運算符重載

    【C++初階】類與對象:6大默認成員函數(shù)------拷貝構造和賦值運算符重載

    ? 拷貝構造函數(shù): 只有單個形參,該形參是對本類類型對象的引用(一般常用const修飾) ,在用已存在的類類型對象創(chuàng)建新對象時由編譯器自動調用。 1. 拷貝構造函數(shù)是 構造函數(shù)的一個重載形式 ; 2. 拷貝構造函數(shù)的 參數(shù)只有一個且必須是類類型對象的引用 ,使用傳值方式編

    2024年02月03日
    瀏覽(26)
  • C++ 學習 ::【基礎篇:16】:C++ 類的基本成員函數(shù):拷貝構造函數(shù)(認識、特征、注意點及典型使用場景)及其基本寫法與調用

    C++ 學習 ::【基礎篇:16】:C++ 類的基本成員函數(shù):拷貝構造函數(shù)(認識、特征、注意點及典型使用場景)及其基本寫法與調用

    本系列 C++ 相關文章 僅為筆者學習筆記記錄,用自己的理解記錄學習!C++ 學習系列將分為三個階段: 基礎篇、STL 篇、高階數(shù)據(jù)結構與算法篇 ,相關重點內容如下: 基礎篇 : 類與對象 (涉及C++的三大特性等); STL 篇 : 學習使用 C++ 提供的 STL 相關庫 ; 高階數(shù)據(jù)結構與算

    2024年02月08日
    瀏覽(21)
  • 【C++】類和對象④(類的默認成員函數(shù):取地址及const取地址重載 | 再談構造函數(shù):初始化列表,隱式類型轉換,缺省值)

    【C++】類和對象④(類的默認成員函數(shù):取地址及const取地址重載 | 再談構造函數(shù):初始化列表,隱式類型轉換,缺省值)

    ?? 個人主頁: Forcible Bug Maker ?? 專欄: C++ 目錄 前言 取地址及const取地址操作符重載 再談構造函數(shù) 初始化列表 隱式類型轉換 explicit 成員變量缺省值 結語 本篇主要內容:類的六個默認成員函數(shù)中的 取地址 及 const取地址重載 , 構造函數(shù) 初始化列表 , 隱式類型轉換

    2024年04月26日
    瀏覽(29)
  • 【C++】構造函數(shù),析構函數(shù),拷貝構造,運算符重載,const 成員

    默認成員函數(shù):如果不顯示,編譯器默認生成 構造函數(shù):是一個特殊的 成員函數(shù) ,函數(shù)名與類名相同,專門用于 初始化類對象 函數(shù)名與類名相同 無返回值 ,沒有被聲明為void類型 對象實例化時 編譯器自動調用 , Date d1 ,或 Date d2(2023, 4, 21) 構造函數(shù)可以重載,一個類中可以

    2023年04月24日
    瀏覽(25)
  • C++類的默認成員函數(shù)

    C++類的默認成員函數(shù)

    什么是默認函數(shù)? 默認函數(shù)就是當你使用這個類對象時,這個類會自動調用的函數(shù)C++中有六個默認成員函數(shù),并且作用各不相同,下面我們來一一進行介紹 什么是構造函數(shù)?構造函數(shù)是干什么的? 什么是析構函數(shù)?析構函數(shù)是干什么的? 我們以棧為例,每一次我們在使用棧的時

    2024年02月02日
    瀏覽(24)
  • 【C++】類的默認成員函數(shù)(下)

    【C++】類的默認成員函數(shù)(下)

    ?? 博客主頁 : 小羊失眠啦. ?? 系列專欄 : 《C語言》 《數(shù)據(jù)結構》 《C++》 《Linux》 《Cpolar》 ?? 感謝大家點贊??收藏?評論?? 本章主要內容為認識與學習C++非常重要的概念—— 運算符重載 。通過 日期類 的實現(xiàn),逐步學習各個運算符重載的實現(xiàn)方法即含義。6個默

    2024年03月18日
    瀏覽(28)
  • 【C++】類的默認成員函數(shù)----const成員函數(shù)(超詳細解析)

    【C++】類的默認成員函數(shù)----const成員函數(shù)(超詳細解析)

    目錄 一、前言 二、const成員函數(shù)? ??const修飾類的成員函數(shù)? ??問題1? ??問題2 ??針對const成員函數(shù)的??济嬖囶}(重點!?。???取地址及const取地址操作符重載 三、共勉 ?? 在我們前面學習的 類 中,我們會定義 成員變量 和 成員函數(shù) ,這些我們自己定義的函數(shù)都是普

    2024年04月14日
    瀏覽(17)
  • C++:類的六個默認成員函數(shù)

    C++:類的六個默認成員函數(shù)

    個人主頁 : 個人主頁 個人專欄 : 《數(shù)據(jù)結構》 《C語言》《C++》 本篇博客作為C++知識總結,我們來認識類的六個默認成員函數(shù)。 下面我主要以日期類作為示例顯示。 構造函數(shù) 是一個特殊的成員函數(shù),名字與類名相同,創(chuàng)建類類型對象時(實例化類)由編譯器自動調用,以保

    2024年02月08日
    瀏覽(18)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包