C++拾遺--構造函數(二)拷貝構造

                       C++拾遺--構造函數(二)拷貝構造

前言

    在構造函數(一)中討論的是默認構造函數的一些應用。這裏我們來探討下其它的一些有名構造函數,及其它們的應用場景。

實例

#include <iostream>
using namespace std;

class Complex
{
protected:
	int real = 0;
	int imag = 0;
public:
	//默認構造
	Complex()
	{
		cout << "Complex()" << endl;
	}
	Complex(int r, int i) :real(r), imag(i)
	{
		cout << "Complex(int r, int i)" << endl;
	}
	//指定其它的構造函數完成自己的工作,相當於委託
	Complex(int r) :Complex(r, 0)
	{
		cout << "Complex(int r)" << endl;
	}
	Complex(Complex& com)     //拷貝構造的參數必須是引用類型
	{
		cout << "Complex(Complex& com)" << endl;
		real = com.real;
		imag = com.imag;
	}
	Complex& operator=(Complex& com)     //這裏的參數可以是非引用的
	{
		cout << "Complex& operator=(Complex& com)" << endl;
		real = com.real;
		imag = com.imag;
		return *this;
	}
};
int main()
{
	Complex com1;            //默認初始化,調用Complex()默認構造
	cout << "---" << endl;
	Complex com2(com1);      //直接初始化,調用Complex(Complex& com)
	cout << "---" << endl;
	Complex com3 = com1;     //賦值初始化,調用Complex(Complex& com)
	cout << "---" << endl;
	Complex com4;            //默認初始化,調用Complex()默認構造
	cout << "---" << endl;
	com4 = com1;             //賦值,調用operator=(Complex& com)
	cout << "---" << endl;
	Complex com5(1, 1);      //調用指定的構造函數Complex(int r, int i)
	cout << "---" << endl;
	Complex com6(1);
	cin.get();
	return 0;
}
運行



有名構造函數

1.拷貝構造

類似於Complex(Complex& com, arg_list);其中的第一個參數必須是該類類型的引用類型,arg_list是可選的,若存在,則必須具有默認實參,這就是拷貝構造函數。

所謂的淺拷貝和深拷貝,針對的是指針成員,對於普通成員,則無區別。對於指針成員而言,僅僅複製一份地址,則是淺拷貝,若複製的是內容,則是深拷貝。

若複製的僅僅是一份地址,則多個對象會共用同一份資源,當其中一個對象被銷燬,資源隨之銷燬。其它對象則受影響。這就是所謂的淺拷貝和深拷貝的問題。

2.委託構造

在新標準中把類似於 Complex(int r):Complex(r, 0){}的構造稱爲委託構造。

類比於設計模式:委託,可以很好理解。Complex(int r)把實際工作交給了Complex(r, 0)。




本專欄目錄

所有內容目錄



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章