1. 程式人生 > >C++中的賦值運算符重載函數(operator=)

C++中的賦值運算符重載函數(operator=)

沒有 char 資料 operator 效率 turn 不能 this .com

    MyStr& operator =(const MyStr& str)//賦值運算符
    {
        cout << "operator =" << endl;
        if (this != &str)
        {
            if (name != NULL)
                delete name;
            this->id = str.id;
            int len = strlen(str.name);
            name = new char[len + 1];
            strcpy_s(name, strlen(str.name) + 1, str.name);
        }
        return *this;
    }

.參數

一般地,賦值運算符重載函數的參數是函數所在類的const類型的引用(如上面例1),加const是因為:

①我們不希望在這個函數中對用來進行賦值的“原版”做任何修改。

②加上const,對於const的和非const的實參,函數就能接受;如果不加,就只能接受非const的實參。

用引用是因為:

這樣可以避免在函數調用時對實參的一次拷貝,提高了效率。

註意

上面的規定都不是強制的,可以不加const,也可以沒有引用,甚至參數可以不是函數所在的對象,正如後面例2中的那樣。

.返回值

一般地,返回值是被賦值者的引用,即*this(如上面例1),原因是

①這樣在函數返回時避免一次拷貝,提高了效率。

②更重要的,這樣可以實現連續賦值,即類似a=b=c這樣。如果不是返回引用而是返回值類型,那麽,執行a=b時,調用賦值運算符重載函數,在函數返回時,由於返回的是值類型,所以要對return後邊的“東西”進行一次拷貝,得到一個未命名的副本(有些資料上稱之為“匿名對象”),然後將這個副本返回,而這個副本是右值,所以,執行a=b後,得到的是一個右值,再執行=c就會出錯。

註意

這也不是強制的,我們可以將函數返回值聲明為void,然後什麽也不返回,只不過這樣就不能夠連續賦值了。

.調用時機

當為一個類對象賦值(註意:可以用本類對象為其賦值(如上面例1),也可以用其它類型(如內置類型)的值為其賦值,關於這一點,見後面的例2)時,會由該對象調用該類的賦值運算符重載函數。

如上邊代碼中

str2 = str1;

一句,用str1為str2賦值,會由str2調用MyStr類的賦值運算符重載函數。

需要註意的是,

MyStr str2;

str2 = str1;

MyStr str3 = str2;

在調用函數上是有區別的。正如我們在上面結果中看到的那樣。

前者MyStr str2;一句是str2的聲明加定義,調用無參構造函數,所以str2 = str1;一句是在str2已經存在的情況下,用str1來為str2賦值,調用的是拷貝賦值運算符重載函數;而後者,是用str2來初始化str3,調用的是拷貝構造函數。

詳細請看:https://www.cnblogs.com/zpcdbky/p/5027481.html

C++中的賦值運算符重載函數(operator=)