文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>拷贝构造函数与赋值运算符

拷贝构造函数与赋值运算符

时间:2010-09-18  来源:zyd_cu

对于C++而言,简单类型的赋值运算,参数传递都是通过简单拷贝变量的值实现,对于简单的类,也可通过逐个成员拷贝的方式实现,但当类中有指针的情况下,简单的成员拷贝(浅拷贝)很容易导致问题,这时,类需要重载自己的赋值运算符,以及实现拷贝构造函数。

 

拷贝构造函数主要用于以下场合:

1.   一个对象以值传递的方式传入函数体

2.   一个对象以值传递的方式从函数返回

3.    一个对象需要通过另外一个对象进行初始化

 

如下例所示,如果不重载赋值运算符和实现拷贝构造函数,则当a赋值给b时,通过简单的逐个成员赋值,a、b的value指向同一内存单元,当b离开其作用域时,b对象被析构,b的value指向的存储单元被释放(亦即a的value指向的存储单元),然后用a对c赋值,a和c对指向一片不确定的存储区域,main结束时,a、c对象被析构,这片不确定的空间被delete两次;而重载赋值运算符和实现拷贝构造函数后,就不会出现上述的问题。

 

#include <iostream>
#include <cstring>
using namespace std;

class String {
public:
    String(char *value)
    {
        this->value = new char[strlen(value) + 1];
        strcpy(this->value, value);
    }
    ~String()
    {
        delete [] value;
    }
/*
    String(String& s)
    {
        this->value = new char[strlen(s.value) + 1];
        strcpy(this->value, s.value);
    }

    String& operator = (String &s)
    {
        delete this->value;
        this->value = new char[strlen(s.value) + 1];
        strcpy(this->value, s.value);
    }
*/
public:
    char *value;
};

int main()
{
    String a("hello");
    {
        String b("world");
        b = a; /* b的value与a的value指向同一片区域 */
    }
    /* 离开了b的作用域,b对象被析构,b的value区域被释放,a指向一片不确定的区域 */
    String c = a;
    cout << a.value << endl;
    cout << c.value << endl;
}


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载