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)。
本專欄目錄
所有內容目錄