歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++ 復制構造函數

1. 概念:只有單個形參,而且該形參是對本類類型對象的引用(常用const修飾)。

2. 首先看一個小例子:

.h中:

class Test
{
public:
    Test(int m,float n):a(m),b(n) { }

private:
    int a;
    float b;
};
.cpp中:

int  main()

{

      Test test1(5, 5.5);

      Test test2(1, 1.1);

      cout<<test2.a<<endl;      //很明顯,輸出1

      cout<<test2.b<<endl;      //很明顯,輸出1.1

      Test test3(test1);      //或者test3 = test1

      cout<<test3.a<<endl;          //輸出5

      cout<<test3.b<<endl;          //輸出5.5

      return 0;

}

test3使用了編譯器提供的默認復制構造函數,即將類類型對象test1(與test3同類型)的非static成員復制給test3了(如有數組成員,則會逐個數組元素復制。因為數組不支持直接復制,只能遍歷復制,所以默認復制構造函數會進行遍歷復制數組元素)。。  程序中沒有顯示提供復制構造函數,所以編譯器會合成一個。

2. 顯示提供復制構造函數

.h中:

class Test
{
public:
 Test()          //方便定義test2
 {
 }
 Test(int m,float n):a(m),b(n) { }

 Test &test(const Test&);    //顯示聲明的復制構造函數

public:
 int a;
 float b;
};

.cpp 中

Test &Test::test(const Test& obj)
{
    a = obj.a;      //拷貝的關鍵.如果注釋掉,則當前對象的a和b都是隨機值
    b = obj.b;
    return *this;    //返回當前對象
}

int main()

{

    Test test1(2, 5.4);
    Test test2;
    test2.test(test1);    //調用復制構造函數
    cout<<test2.a<<endl;
    cout<<test2.b<<endl;

    return 0;

}

Copyright © Linux教程網 All Rights Reserved