原创 拷贝构造函数剖析

2010-4-23 10:17 2090 4 4 分类: MCU/ 嵌入式

 


作者:冯利美,华清远见嵌入式学院讲师。


在讲课过程中,我发现大部分学生对拷贝构造函数的理解不够深入,不明白自定义拷贝构造函数的必要性。因此,我将这部分内容,进行了总结。


拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。功能:使用一个已经存在的对象始初化同类的一个新对象。这样得到对象和原来的对象具有完全相同的数据成员,即相同的属性。


拷贝构造函数的函数原型:
        A ( const A& other) { … … }


拷贝构造函数的应用场合:


当用类的一个对象去初始化该类的另一个对象时;若函数的形参为类对象,调用函数时,实参赋值给形参;当函数的返回值是类对象时。比如:
        A a1(10); // 构造函数
        A a2 = a1; // 拷贝构造函数
        A a3(a1); // 拷贝构造函数


默认拷贝构造函数:成员变量之间的“值”拷贝


编写拷贝构造函数的必要性
        class A
        {
                public:
                A(const char* data)
                {
                        name = new char[strlen(data) + 1];
                        strcpy (name, data);
                }
                A(const A& other)
                {
                        name = new char[strlen(other.name) + 1];
                        strcpy(name, other.name);
                }
        private:
        char* name;
        };
        考察:char* data = “abcd”; A a1(data); A a2 = a1;


如果未定义拷贝构造函数,会有何种后果?


现将a1赋给a2,缺省拷贝构造函数的“位拷贝”意味着执行a2.name = a1.name。这将造成二个错误:一是a2.name和a1.name指向同一块内存,任何一方变动都会影响另一方;二是在对象被析构时,name被释放了两次。

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /2 下一条