最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++?拷貝構(gòu)造函數(shù)與賦值的區(qū)別

 更新時間:2024年04月29日 08:32:38   作者:啊QQQQQ  
拷貝構(gòu)造函數(shù)和賦值函數(shù)非常容易混淆,本文主要介紹了C++?拷貝構(gòu)造函數(shù)與賦值的區(qū)別,具有一定的參考價值,感興趣的可以了解一下

拷貝構(gòu)造函數(shù)

拷貝構(gòu)造函數(shù)的也是一種構(gòu)造函數(shù),它的作用是將一個類的成員拷貝到另一個類中,類似于賦值??截悩?gòu)造函數(shù)分為深拷貝和淺拷貝。

先來定義一個拷貝構(gòu)造函數(shù)(構(gòu)造函數(shù)可以重載),看招:

#include<iostream>
using namespace std;
class date
{
public:
	date(int year=0, int month=0, int day=0)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	date(const date& d)//拷貝構(gòu)造函數(shù)
	{
		this->_year = d._year;
		this->_month = d._month;
		this->_day = d._day;
	}
	void print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

 將一個類拷貝到另一個類中,自然是需要對應(yīng)的參數(shù)的,參數(shù)就是類,這里可以傳遞指針,引用更好,只是傳值形參的話,會造成無限遞歸。

拷貝構(gòu)造函數(shù)的使用方法

拷貝構(gòu)造函數(shù)的使用:
1.使用();2.使用'=';像這樣

拷貝構(gòu)造函數(shù)與賦值運(yùn)算符的區(qū)別

那么拷貝構(gòu)造函數(shù)和賦值運(yùn)算符有什么區(qū)別呢,先來看一段代碼對比一下:

int main()
{
	date d1(20244, 4, 24);
	date d2=d1;
	date d3;
	d3= d1;//編譯器會自動將其轉(zhuǎn)化為d3(d1);
	return 0;
}

這里d2采用的拷貝構(gòu)造函數(shù)的方式,d3采用賦值的方式,通過觀察,我們可以發(fā)現(xiàn),前者是創(chuàng)造變量時就對類進(jìn)行了賦值,這個賦值叫做初始化,而后者是先定義好的類,后續(xù)賦值,在賦值之前是已經(jīng)將變量創(chuàng)建好的;

談深拷貝和淺拷貝

先說淺拷貝

淺拷貝

淺拷貝就是對成員變量進(jìn)行一一對應(yīng)賦值,來看一個代碼:

#include<iostream>
using namespace std;
class date
{
public:
	date(int a=1,int b=1)
	{
		_a = a;
		_b = b;
	}
	date(const date& d)
	{
		_a = d._a;//成員變量簡單的賦值
		_b = d._b;
	}
	void print()
	{
		cout << _a << ',' << _b << endl;
	}
	~date()
	{
		cout << "~date" << endl;
	}
private:
	int _a;
	int _b;
};


int main()
{
	date d1(2,5);
	date d2(d1);
	d2.print();
	return 0;
}

 在這個代碼中,在對d2進(jìn)行初始化的時候,是將d1的成員變量對d進(jìn)行了賦值;最后代碼結(jié)束存在兩次析構(gòu),分別是d2和d1的;

注意:

對于簡單的成員變量進(jìn)行簡單的復(fù)制操作并無大礙,但是如果是指針類型的變量就會出現(xiàn)問題;看代碼;

#include<iostream>
using namespace std;
class date
{
public:
	date(int b=1)
	{
		_a =new int[4];
		_b = b;
	}
	date(const date& d)
	{
		_a = d._a;
		_b = d._b;
	}
	void print()
	{
		cout << _a << ',' << _b << endl;
	}
	~date()
	{
		free(_a);//拷貝后兩個成員變量都指向同一塊空間,會造成多次析構(gòu)
		cout << "~date" << endl;
	}
private:
	int* _a;
	int _b;
};


int main()
{
	date d1(5);
	date d2(d1);
	d2.print();
	return 0;
}

代碼中_a為指針類型,初始化是對其進(jìn)行開辟空間;代碼結(jié)束對類進(jìn)行析構(gòu),但是問題來了,淺拷貝只是簡單的賦值,針對_a來說,d1和d2的_a都指向同一片空間,這就造成了在代碼結(jié)束時,這片空間會釋放兩次,就會發(fā)生錯誤,對此就需要進(jìn)行深拷貝來解決。 

深拷貝

#include<iostream>
using namespace std;
class date
{
public:
	date(int b=1)
	{
		_a =new int[4];
		_a[0] = 10;
		_b = b;
	}
	date(const date& d)
	{
		_a = new int[4];
		memcpy(_a, d._a, sizeof(int) * 4);//將d2的數(shù)據(jù)拷貝過來
		_b = d._b;
	}
	void print()
	{
		cout << _a[0] << ',' << _b << endl;
	}
	~date()
	{
		free(_a);
		cout << "~date" << endl;
	}
private:
	int* _a;
	int _b;
};


int main()
{
	date d1(5);
	date d2(d1);
	d2.print();
	return 0;
}

在拷貝構(gòu)造的時候?qū)Ρ绢惖腳a也進(jìn)行開辟空間,然后把另一類的數(shù)據(jù)利用memcpy拷貝過來就OK了。 這樣就不會出現(xiàn)析構(gòu)多次同一片空間的問題。

到此這篇關(guān)于C++ 拷貝構(gòu)造函數(shù)與賦值的區(qū)別的文章就介紹到這了,更多相關(guān)C++ 拷貝構(gòu)造函數(shù)與賦值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++輕量級界面開發(fā)框架ImGUI介紹小結(jié)

    C++輕量級界面開發(fā)框架ImGUI介紹小結(jié)

    如果從事過C++?Windows客戶端開發(fā),大家對MFC、Qt、DuiLib等各種DirectUI應(yīng)該有了解,本篇給大家介紹一個超級輕量級的C++開源跨平臺圖形界面框架ImGUI,感興趣的可以了解一下
    2021-11-11
  • 200行C語言代碼實(shí)現(xiàn)簡易三子棋游戲

    200行C語言代碼實(shí)現(xiàn)簡易三子棋游戲

    三子棋(井字棋)我們的童年或多或少都體驗(yàn)過這個游戲的樂趣,本子隨手一畫就是一局游戲的開始,下面這篇文章主要給大家介紹了關(guān)于200行C語言代碼實(shí)現(xiàn)簡易三子棋游戲的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • C++對Json數(shù)據(jù)的友好處理實(shí)現(xiàn)過程

    C++對Json數(shù)據(jù)的友好處理實(shí)現(xiàn)過程

    在Ajax的應(yīng)用中,前臺基本上會用到JSON作為數(shù)據(jù)交換格式,所以下面這篇文章主要給大家介紹了關(guān)于C++對Json數(shù)據(jù)的友好處理,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • C語言學(xué)生信息管理系統(tǒng)小項(xiàng)目

    C語言學(xué)生信息管理系統(tǒng)小項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了C語言學(xué)生信息管理系統(tǒng)小項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++作用域與函數(shù)重載的實(shí)現(xiàn)

    C++作用域與函數(shù)重載的實(shí)現(xiàn)

    本文主要介紹了C++作用域與函數(shù)重載的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • C++實(shí)現(xiàn)基于reactor的百萬級并發(fā)服務(wù)器

    C++實(shí)現(xiàn)基于reactor的百萬級并發(fā)服務(wù)器

    本文介紹了基于Reactor模式的百萬級并發(fā)服務(wù)器,使用epoll進(jìn)行高效I/O多路復(fù)用,支持多個端口的監(jiān)聽,并通過回調(diào)機(jī)制處理每個連接的接收和發(fā)送操作,需要的朋友可以參考下
    2025-02-02
  • Matlab控制電腦攝像實(shí)現(xiàn)實(shí)時人臉檢測和識別詳解

    Matlab控制電腦攝像實(shí)現(xiàn)實(shí)時人臉檢測和識別詳解

    人臉識別過程主要由四個階段組成:人臉檢測、圖像預(yù)處理、面部特征提取和特征識別。這篇文章主要介紹了如何使用MATLAB控制筆記本電腦的攝像頭,并進(jìn)行實(shí)時人臉檢測和識別,需要的可以參考一下
    2022-10-10
  • C語言數(shù)據(jù)結(jié)構(gòu)樹之后序遍歷的實(shí)現(xiàn)

    C語言數(shù)據(jù)結(jié)構(gòu)樹之后序遍歷的實(shí)現(xiàn)

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之后序遍歷的實(shí)現(xiàn)的相關(guān)資料,這里提供一個簡單實(shí)例來實(shí)現(xiàn)后續(xù)遍歷,對于數(shù)據(jù)結(jié)構(gòu)樹的學(xué)習(xí)很有幫助,需要的朋友可以參考下
    2017-07-07
  • C++實(shí)現(xiàn)Window環(huán)境聊天室功能

    C++實(shí)現(xiàn)Window環(huán)境聊天室功能

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)Window環(huán)境聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++?STL實(shí)現(xiàn)非變易查找算法的示例代碼

    C++?STL實(shí)現(xiàn)非變易查找算法的示例代碼

    C++?STL?中的非變易算法(Non-modifying?Algorithms)是指那些不會修改容器內(nèi)容的算法,是C++提供的一組模板函數(shù),下面我們就來看看這一算法的應(yīng)用吧
    2023-08-08

最新評論

高碑店市| 根河市| 西吉县| 潼南县| 盱眙县| 萨嘎县| 黔江区| 藁城市| 阿拉善右旗| 黄梅县| 天津市| 辽宁省| 巴林左旗| 调兵山市| 湘潭市| 镇原县| 涞源县| 黄陵县| 武义县| 鹰潭市| 时尚| 诸城市| 东山县| 灌南县| 垣曲县| 太原市| 蓬溪县| 北安市| 昌都县| 日照市| 镇江市| 安仁县| 乐山市| 新营市| 临汾市| 新野县| 客服| 隆回县| 岳普湖县| 刚察县| 泸溪县|