动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息

本月文章推荐
.正确使用 C++Builder组件缩.
.C++ 中大尺寸图象的显示技巧.
.C语言常用的三种排序方法总结与探.
.websphere新建C/C++客户机.
.求从棋盘的坐下角到右上角的无环.
.在C++Builder中使用DLL.
.Windows编程基础 - 概.
.C语言中的面向对象(4)-面向对象.
.一般线性链表类的C++实现.
.C语言教程第五章:函数.
.C语言中使用环境变量的技巧.
.Windows Sockets:转换字符串.
.可怜的Bool——浅析程序可扩展性.
.利用 C++Builder 定制系统菜单.
.深度探索C++对象模型(2).
..
.对C++递增(增量)运算符重载的思考.
.局部类和嵌套类.
.C++程序员必需的修养.
.使用C++深入研究.NET委托与事件.

C++对象的拷贝与赋值操作

发表日期:2008-3-8 |


我发现一些同事在编写一个类时,知道什么时候需要实现拷贝构造函数和赋值操作,但不知道什么时候拷贝构造函数被调用,什么时候赋值操作被调用,甚至把二者混为一谈。
要弄明白这个问题,最简单的做法莫过于写个测试程序试一下。不过那样做也未必是好办法,实验的结果往往导致以偏概全的结论。不如好好想一下,弄清楚其中的原理,再去写程序去验证也不迟。
拷贝构造函数,顾名思义,等于拷贝+ 构造。它肩负着创建新对象的任务,同时还要负责把另外一个对象拷贝过来。比如下面的情况就调用拷贝构造函数: CString str = strOther;
赋值操作则只含有拷贝的意思,也就是说对象必须已经存在。比如下面的情况会调用赋值操作。 str = strOther;
   不过有的对象是隐式的,由编译器产生的代码创建,比如函数以传值的方式传递一个对象时。由于看不见相关代码,所以不太轻易明白。不过我们稍微思考一下,就会想到,既然是根据一个存在的对象拷贝生成新的对象,自然是调用拷贝构造函数了。
两者实现时有什么差别呢?我想有人会说,没有差别。呵,假如没有差别,那么只要实现其中一个就行了,何必要两者都实现呢?不绕圈子了,它们的差别是:
    拷贝构造函数对同一个对象来说只会调用一次,而且是在对象构造时调用。此时对象本身还没有构造,无需要去释放自己的一些资源。而赋值操作可能会调用多次,你在拷贝之前要释放自己的一些资源,否则会造成资源泄露。
   明白了这些道理之后,我们不防写个测试程序来验证一下我们的想法:
#include <stdio.h>
#include <STDLIB.H>
#include <string.h>
classCString
{
public:
CString();
CString(constchar* pszBuffer);
~CString();
CString(constCString& other);
constCString& operator=(constCString& other);
private:
char* m_pszBuffer;;
};
CString::CString()
{
printf("CString::CString\n");
m_pszBuffer= NULL;
return;
}
CString::CString(constchar* pszBuffer)
{
printf("CString::CString(const char* pszBuffer)\n");
m_pszBuffer= pszBuffer!= NULL? strdup(pszBuffer) : NULL;
return;
}
CString::~CString()
{
printf("%s\n", __func__);
deletem_pszBuffer;
m_pszBuffer= NULL;
return;
}
CString::CString(constCString& other)
{
if(this== &other)
{
return;
}
printf("CString::CString(const CString& other)\n");
m_pszBuffer= other.m_pszBuffer!= NULL? strdup(other.m_pszBuffer) : NULL;
}
constCString& CString::operator=(constCString& other)
{
printf("const CString& CString::operator=(const CString& other)\n");
if(this== &other)
{
return*this;
}
if(m_pszBuffer!= NULL)
{
free(m_pszBuffer);
m_pszBuffer= NULL;
}
m_pszBuffer= other.m_pszBuffer!= NULL? strdup(other.m_pszBuffer) : NULL;
return*this;
}
voidtest(CStringstr)
{
CStringstr1= str;
return;
}
intmain(intargc, char* argv[])
{
CStringstr;
CStringstr1= "test";
CStringstr2= str1;
str1= str;
CStringstr3= str3;
test(str);
return0;
} 原文地址:http://dev.csdn.net/author/absurd/082775af05e44a4db1e9cdb4977687b2.Html

上一篇:用C语言加速程序进而加速硬件速度 人气:309
下一篇:对C++标准委员会强制For循环的不同看法 人气:263
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-7 站长中国企业(公司)网站系统 v4.2
2008-9-7 PBDigg v2.0 Build 20080821
2008-9-7 玩玩小游戏FLASH系统 v2.1
2008-9-7 522QQ在线电视直播程序 v1.1
2008-9-7 Pcook cms 文章管理系统 (老Y CM
2008-9-7 仿代码小说小偷系统 v1.0
2008-9-7 百度一搜集成搜索管理系统
2008-9-7 小贤统计器 v1.0
2008-9-7 UCenter Home-中秋搏饼插件 v1.2
2008-9-7 iBlacklist通话黑名单汉化破解补
2008-9-7 EndlessWalls无尽壁纸 v1.0.4破解
2008-9-7 Dynolicious车载测量仪v1.1破解版
2008-9-7 iVoodoo巫毒娃娃1.0.1破解版
2008-9-7 iWallpape精品墙纸1.2破解版
2008-9-7 iChillout自然音效工具1.1破解版
2008-9-7 Todo计划提醒1.2破解版
2008-9-7 allRadio电台集合1.01破解版
2008-9-7 My Money个人理财1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵