通行证: 用户 密码
http://www.pconline.cn/
汽车网 | 游戏网 | 时尚女性
分站:北京 上海 广州 深圳 香港
广西 重庆 山东 江苏 辽宁 福建
首 页 | 今日报价 | 新闻中心 | 数码世界 | 硬件资讯 | 软件资讯 | 下 载 | 游 戏 |
论 坛 | 产 品 库 | 渠道商情 | 招聘培训 | 二    手 | 评 测 室 | 导 购 | 社 区 |
摄影
部落
手 机
数码相机
随身听
 DIY配件
笔记本
 台式机
摄像机
精品廊
-
您现在的位置:软件资讯 > 开发特区 > 开发语言 > C/C++
  C++运算符重载赋值运算符 出处:PConline
[ 2005-04-01 15:18:56 ] 作者:管宁 责任编辑:xietaoming
-

  自定义类的赋值运算符重载函数的作用与内置赋值运算符的作用类似,但是要要注意的是,它与拷贝构造函数与析构函数一样,要注意深拷贝浅拷贝的问题,在没有深拷贝浅拷贝的情况下,如果没有指定默认的赋值运算符重载函数,那么系统将会自动提供一个赋值运算符重载函数。

  赋值运算符重载函数的定义与其它运算符重载函数的定义是差不多的。

  下面我们以实例说明如何使用它,代码如下:

//程序作者:管宁 
//站点: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;就属于此种情况)。


正在加载评论,请稍候…

ad
发给好友 我要报错 投稿给我们 加入收藏 返回顶部

本栏今日更新
相关文章
·仅用一条指令实现界面换肤和多语言版本
·表情[人物]:55555~~偶走了
·菜鸟必备知识:打假网上行
·看看自家电脑的不足之处2
·变变变!Win XP桌面文字消失吧
·尽情搞怪72变:认识专业变声工具
·用永中Office管理学籍就这样简单
·认识更多格式,读懂电影下载"黑话"
·C++运算符重载转换运算符
·对C++递增(增量)运算符重载的思考
·C++中利用构造函数与无名对象简化运算符重载函数
·C++运算符重载函数基础及其值返回状态
·图文例解C++类的多重继承与虚拟继承
·Eclipse3.06 + MinGW3.1配置标准C/C++开发环境
·C++中类的多态与虚函数的使用
·图例实解:C++中类的继承特性

完美时尚娱乐:2004年腾讯QQ评测大观
精彩无限:MSN Shell4使用指南
亲手制作鲜花情人贺卡送给她
挑战伏明霞?企鹅跳水游戏,看你能得多少分?

新闻搜索
高级搜索
Flash排行榜
·《老鼠爱大米》黑白版
·Take Me To Your Heart
·当你孤单你会想起谁
·别说我的眼泪你无所谓
·下辈子如果我还记得你
·超好玩小游戏!淘金者
·《老鼠爱大米》学生版
·大学自习室继-就说
·光良最新力作-童话
·等你说爱我-如果有一天
热点专题
·全面了解FireFox浏览器
·"麦"进新时代:QQ玩超级语音
·妙手解决多媒体播放的痼疾
·Tom-Skype:分享语聊新体验
·回味:04年软件"开门七件事"
·04年软件八大热点精彩回眸
·欢乐Flash带你畅游圣诞
·优化:打造更好用的WinXP
·十大超人气趣味小游戏
·最受关注补丁SP2横空出世
·寻觅流行IM最爱大决战!
·04十大最动人心扉的情感MV
IT培训十大热门文章
-