C /CLI思辨录之拷贝构造函数
2008-02-23 05:05:29来源:互联网 阅读 ()
#include <stdio.h> #include <string.h> class Person { private: char* _name; public: Person() { _name = new char[256]; } void SetName(const char* name) { if(strlen(name) 1 < 256) strcpy(_name,name); } void PrintName() { printf("%s\n",_name); } }; int main() { // 创建对象的第一个实例并赋于名字为John Person p1; p1.SetName("John"); p1.PrintName(); //通过复制p1引用的对象创建另一个对象 Person p2(p1); p2.SetName("Alice"); p2.PrintName(); //现在再输出p1的名字 p1.PrintName(); scanf("q"); return 0; } |
这里的类Person有一个指向在堆上分配的字符数组的指针。当构造Person对象时,他创建该字符数组并把他的位置存放到变量_name中。
但是当您创建Person 对象 p2 时,p2的成员用p1的成员初始化。因而,p1的 _name和p2的 _name指向相同的堆对象。如在上例中看到的,调用p2.SetName将改变由这两个类共享的值。所以,当第二次调用p1.PrintName,打印结果是"Alice"。
所以,这不是我们复制对象所期望的结果,而且还会导致堆崩溃的问题。请再考虑某个函数删除了该数组而p1又要调用该函数的情况?下面,当p2调用PrintName时,他将尽量存取实际上不是在堆上的对象。这种情况下产生的结果往往是难以预料的。
C 允许我们通过定义拷贝构造函数来克服这类问题。在我们每次通过复制另一个对象来初始化一个对象时,拷贝构造函数都被执行。您能够在拷贝构造函数中覆盖掉缺省的成员函数的复制行为。
所以,我们的类Person应该修改如下:
class Person { private: char* _name; public: Person() { _name = new char[256]; } // 这是拷贝构造函数。在此我们初始化一个新的数组,为Person的实例所用 Person(Person&) { _name = new char[256]; } void SetName(const char* name) { if(strlen(name) 1 < 256) strcpy(_name,name); } void PrintName() { printf("%s\n",_name); } }; |
这里类Person中的拷贝构造函数确保了他初始化一个新的数组,为在复制时产生的每一个对象实例所用。这就避免了前面我们提到的问题。
希望上面所述能够帮助读者理解拷贝构造函数及其使用场所。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇: C /CLI思辨录之代理构造函数
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash