国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C++運算符重載賦值運算符

2019-11-17 05:03:44
字體:
來源:轉載
供稿:網友

  自定義類的賦值運算符重載函數的作用與內置賦值運算符的作用類似,但是要要注重的是,它與拷貝構造函數與析構函數一樣,要注重深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,假如沒有指定默認的賦值運算符重載函數,
那么系統將會自動提供一個賦值運算符重載函數。

  賦值運算符重載函數的定義與其它運算符重載函數的定義是差不多的。

  下面我們以實例說明如何使用它,代碼如下:
//程序作者:管寧 
//站點:www.cndev-lab.com 
//所有稿件均有版權,如要轉載,請務必聞名出處和作者 
 
#include <iostream>     
using namespace std;     
     
class Internet 

    public: 
        Internet(char *name,char *url) 
        { 
            Internet::name = new char[strlen(name)+1]; 
            Internet::url = new char[strlen(url)+1]; 
            if(name) 
            { 
                strcpy(Internet::name,name); 
            } 
            if(url) 
            { 
                strcpy(Internet::url,url); 
            } 
        } 
        Internet(Internet &temp) 
        { 
            Internet::name=new char[strlen(temp.name)+1]; 
            Internet::url=new char[strlen(temp.url)+1]; 
            if(name) 
            { 
                strcpy(Internet::name,temp.name); 
            } 

            if(url) 
            { 
                strcpy(Internet::url,temp.url); 
            } 
        } 
        ~Internet() 
        { 
            delete[] name; 
            delete[] url; 
        } 
        Internet& Operator =(Internet &temp)//賦值運算符重載函數 
        { 
            delete[] this->name; 
            delete[] this->url; 
            this->name = new char[strlen(temp.name)+1]; 
            this->url = new char[strlen(temp.url)+1]; 
            if(this->name) 
            { 
                strcpy(this->name,temp.name); 
            } 
            if(this->url) 
            { 
                strcpy(this->url,temp.url); 
            } 
            return *this; 
        } 
    public: 
        char *name; 
        char *url; 
}; 
int main() 
{   
    Internet a("中國軟件開發實驗室","www.cndev-lab.com"); 
    Internet b = a;//b對象還不存在,所以調用拷貝構造函數,進行構造處理。 

    cout<<b.name<<endl<<b.url<<endl; 
    Internet c("美國在線","www.aol.com"); 
    b = c;//b對象已經存在,所以系統選擇賦值運算符重載函數處理。 
    cout<<b.name<<endl<<b.url<<endl; 
    system("pause"); 
}  上例代碼中的Internet& operator =(Internet &temp)就是賦值運算符重載函數的定義,內部需要先delete的指針就是涉及深拷貝問題的地方,由于b對象已經構造過,name和url指針的范圍已經確定,所以在復制新內容進去之前必須把堆區清除,區域的過大和過小都不好,所以跟在后面重新分配堆區大小,而后進行復制工作。

  在類對象還未存在的情況下,賦值過程是通過拷貝構造函數進行構造處理(代碼中的Internet b = a;就是這種情況),但當對象已經存在,那么賦值過程就是通過賦值運算符重載函數處理(例子中的b = c;就屬于此種情況)。 更多文章 更多內容請看C/C++技術專題專題,或

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 浦江县| 宁远县| 河曲县| 南郑县| 晋中市| 汝阳县| 庆元县| 大悟县| 呼玛县| 西盟| 霍林郭勒市| 商丘市| 阳江市| 玉门市| 九龙坡区| 高州市| 信丰县| 分宜县| 高密市| 密云县| 康定县| 榆社县| 射洪县| 紫云| 丰镇市| 湖南省| 博白县| 唐河县| 阿克陶县| 交口县| 中牟县| 宜城市| 济源市| 夏邑县| 晋城| 罗平县| 万安县| 屯昌县| 蓬溪县| 嵩明县| 枣强县|