1. 程式人生 > >拷貝建構函式與賦值運算子過載的區別

拷貝建構函式與賦值運算子過載的區別

首先要說明的是,若使用者沒有定義,C++隱式宣告一個複製建構函式和一個賦值運算子(完成按資料成員複製的動作)。二者很像,但是在下邊這點上有很大的不同:

複製建構函式是隻在物件例項化才會被呼叫,也就是說,在複製建構函式呼叫期間,這個物件處於一個未決狀態(直到複製建構函式被成功呼叫),另外複製建構函式不返回任何值,void都沒有。

拷貝建構函式應用的場合由以下幾個方面:

  1 函式的引數是一個物件,並且是值傳遞方式

  2 函式的返回值是一個物件,並且是值傳遞方式

  3 用一個物件初始化另外一個物件

賦值運算子則在一個現存的物件被賦予新的值時被呼叫,並且它有返回值。

在下邊這個例子中我們能看到並不是出現“=”就是呼叫賦值建構函式:

#include<iostream>
using namespace std;

class Test
{
    public:
        Test()
        {   
            ctor_count++;
            cout<<"ctor "<<ctor_count<<endl;
        }   

        Test(const Test & r)
        {   
            ctor_count++;
            cout<<"copy ctor "<<ctor_count<<endl;
        }   

        Test & operator= (const Test& r)
        {   
            ctor_count++;
            cout<<"assignment op "<<ctor_count<<endl;
            return *this;
        }   

    private:
        static int ctor_count; //only a declaration
};

int Test::ctor_count=0; // definition + initialization
int Test::ctor_count=0; // definition + initialization
int main()

{
    Test test;
    Test test1=test;
    Test test2(test);
    Test test3=test2=test1;
    return 0;
}

輸出結果

[[email protected]]$ ./a.out
ctor 1
copy ctor 2
copy ctor 3
assignment op 4
copy ctor 5

我們看到:

Test test; //例項化test物件時呼叫了預設建構函式

Test test1=test;// test1使用了複製建構函式(因為這是一個新的物件產生)

Test test2(test);//test2時也是用了複製建構函式,

Test test3=test2=test1;//而test2=test1則使用了賦值建構函式(沒有新的物件產生),

Test test3=test2=test1;//test3=test2則使用了複製建構函式,原因同上。

所以要看是不是有新的物件產生,才能決定到底是呼叫了複製建構函式,還是賦值運算子。


參考文章:

http://blog.csdn.net/anton_6/article/details/6033074

http://www.cnblogs.com/gnuhpc/archive/2012/12/10/2811923.html

相關推薦

C++ 一個demo看懂—拷貝建構函式運算子過載區別

class MyClass { public: MyClass(int i = 0) { cout << i; } MyClass(const MyClass &x) { cout << 2; }

拷貝建構函式運算子過載區別

首先要說明的是,若使用者沒有定義,C++隱式宣告一個複製建構函式和一個賦值運算子(完成按資料成員複製的動作)。二者很像,但是在下邊這點上有很大的不同: 複製建構函式是隻在物件例項化時才會被呼叫,也就是說,在複製建構函式呼叫期間,這個物件處於一個未決狀態(直到複製建構函

c++拷貝建構函式運算子=過載、深拷貝拷貝

 關鍵詞:建構函式,淺拷貝,深拷貝,堆疊(stack),堆heap,賦值運算子 摘要:     在面向物件程式設計中,物件間的相互拷貝和賦值是經常進行的操作。     如果物件在宣告的同時馬上進行的初始化操作,則稱之為拷貝運算。例如:         class1 A(

C++:面試時應該實現的string類(建構函式拷貝建構函式運算子過載和解構函式

一、string類的4個基本函式是什麼? 建構函式 拷貝建構函式 賦值運算子過載 解構函式 二、函式實現 1.建構函式 String(char* pStr = " ")

String類的建構函式、解構函式拷貝建構函式運算子過載

面試碰到的題,答案來自網路搜尋。 class myString{ private: char* m_data; public: myString(const char *str=NULL); myString(const myString &other)

C++:拷貝建構函式&運算子過載函式

拷貝建構函式:          用一個已經存在的物件來生成一個相同型別的新物件。(淺拷貝)預設的拷貝建構函式:          如果自定義了拷貝建構函式,編譯器就不在生成預設的拷貝建構函

面試題14——談談對拷貝建構函式運算子的認識

拷貝建構函式和賦值運算子過載有以下兩個不同之處: (1)拷貝建構函式生成新的類物件,賦值運算子不能; (2)由於拷貝建構函式是直接構造一個新的類物件,所以在初始化這個物件之前不需要檢測原物件是否和新建物件相同,而賦值運算子則需要這個操作,另外賦值運算中如果原來的物件中有記憶體分配要先把記憶體

C++ 拷貝建構函式運算子

本文主要介紹了拷貝建構函式和賦值運算子的區別,以及在什麼時候呼叫拷貝建構函式、什麼情況下呼叫賦值運算子。最後,簡單的分析了下深拷貝和淺拷貝的問題。 拷貝建構函式和賦值運算子 在預設情況下(使用者沒有定義,但是也沒有顯式的刪除),編譯器會自動的隱式生成一個拷貝建構函式和賦值

C++ 複製建構函式運算子過載函式

宣告一個空的類testsize,sizeof(testsize)為1,為其宣告建構函式和解構函式,依舊為1 建構函式不能使用關鍵字virtual,解構函式可以 一旦類中存在虛擬函式,就會為該類生成虛擬函式表,並在每一個例項中新增一個指向虛擬函式表的指標,從而大小為一個指標大

關於拷貝建構函式運算子,轉自VC知識庫

(源出處:http://www.vckbase.com/document/viewdoc/?id=788) 關於拷貝建構函式和賦值運算子作者:馮明德 重點:包含動態分配成員的類 應提供拷貝建構函式,並重載"="賦值操作符。 以下討論中將用到的例子: class CExa

c++拷貝建構函式操作符過載

c++拷貝建構函式: class A { A(const A& a); .... } 由於拷貝建構函式中,一般不允許對原物件進行修改,因此一般在引數中使用const關鍵字進行限制。 拷貝建構函式一般用於需要new記憶體等操作。如果不允許使用拷貝建

C++ 拷貝建構函式函式區別(很嚴謹和全面)

這裡我們用類String 來介紹這兩個函式: 拷貝建構函式是一種特殊建構函式,具有單個形參,該形參(常用const修飾)是對該類型別的引用。當定義一個新物件並用一個同類型的物件對它進行初始化時,將顯式使用拷貝建構函式。為啥形參必須是對該型別的引用呢?試

複製建構函式操作符過載

複製建構函式也就拷貝建構函式,只能在物件初始化時呼叫,或在形參賦值時.因為它總是構造一個新物件並將舊物件的屬性值拷貝過去.賦值操作符過載則可以在任何地方呼叫,不管左操作物件為新舊,都是將右操作物件的屬性值拷貝到左操作物件

c++建構函式拷貝建構函式,解構函式運算子過載

建構函式:        是一個特殊的成員函式,名字與類名相同,建立類型別物件時,由編譯器自動呼叫,在物件的生命週期內只且只調用一次,以保證每個資料成員都有一個合適的初始值。 <strong&g

類String的建構函式拷貝建構函式、解構函式運算子過載函式的實現

#include <iostream> using namespace std; class String { public: String(const char* str= NULL); String(const String& other); ~

C++類中的一些細節(過載、重寫、覆蓋、隱藏,建構函式、解構函式拷貝建構函式函式在繼承時的一些問題)

1 函式的過載、重寫(重定義)、函式覆蓋及隱藏 其實函式過載與函式重寫、函式覆蓋和函式隱藏不是一個層面上的概念。前者是同一個類內,或者同一個函式作用域內,同名不同引數列表的函式之間的關係。而後三者是基類和派生類函式不同情況下的關係。 1.1 函式過載

C++之派生類的拷貝構造運算子過載

這裡只說一下為什麼派生類在拷貝構造器和賦值運算子過載中一些注意語法: 一、派生類的拷貝構造器 1.派生類的拷貝構造器跟普通構造器一樣,若沒有自定義生成,編譯器會自動生成拷貝構造器,自動呼叫父類的拷貝構造器(不管父類的拷貝構造是否自定義或編譯器自動生成)。

C++類和物件.四個預設成員函式運算子過載

1.(1)類的定義   類就是具有相同資料和相同操作的一組物件的集合。 學生類定義: class student {//成員變數char* name;int age;int sex;//成員函式void speak(){cout<<name<<"年

類的建構函式、解構函式拷貝建構函式函式

 類的四種基本預設函式:建構函式、解構函式、拷貝建構函式、賦值函式。 建構函式:建立類時,系統自動呼叫建構函式,用以初始化,分配空間,沒有自定義的建構函式時,系統預設一個無引數的建構函式。 class book { private:     int isBook;

建構函式、複製建構函式運算子的呼叫

1:呼叫無參建構函式,故:Foo constructor。 2:向函式f傳入剛才構造的物件vf1,函式結束值vf1要銷燬。故:Foo copy constructor,Foo destructor 3:由於g函式的形參是引用,故不會呼叫建構函式 4:由於定義物件,並對此物件用產生的物件進行復制(建立一個