浅谈关于类设计中的赋值运算符和复制构造函数

由于修在学习C++的时候类的设计不可避免,而修在创建了类的时候经常会把复制构造函数和赋值运算符搞混,所以开帖特别记忆一下。

一、定义:

1.赋值构造函数接受其所属类的对象作为参数,来创建一个新的类对象。

2.赋值运算符用于处理同类对象之间的赋值,用”=“表示。

二、使用范围及形式说明:
1.复制构造函数原型如下:

1
Star(const Star &)

在以下情况下使用复制构造函数:
①将新对象初始化为一个同类的对象
②按值将对象传递给函数
③函数按值返回对象
④编译器产生临时对象
2.赋值运算符(注意与初始化的区别):

1
2
3
4
Star siriue;
Star alpha = sirus;//初始化
Star dogstar ;
dogstar = sirus;//赋值

赋值运算符用于修改已有对象的值,如果没有动态内存分配可以使用默认的赋值运算符,否则可能需要重载。

由于在类初始化时,编译器会自动为类生成一些成员函数,包括默认的构造函数,复制构造函数和赋值运算符。所以在不需要特殊操作的情况系,无需重新定义。

三、对比
这里用C++perimer plus edition 6书编程练习的一个例子做对比。
复制构造函数:

1
2
3
4
5
6
7
8
9
Cd::Cd(const Cd & d)
{
    performers = new char[strlen(d.performers)+1];
    label = new char[strlen(d.label)+1];
    strcpy(performers,d.performers);
    strcpy(label,d.label);
    selections = d.selections ;
    playtime = d.playtime;
}

赋值运算符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Cd & Cd::operator=(const Cd & d)
{
    //赋值前要删除原来的空间
    if(this == &d)
    {
        return *this ;
    }
    delete [] performers;
    delete [] label ;
    performers = new char[strlen(d.performers)+1];
    label = new char[strlen(d.label)+1];
    strcpy(performers,d.performers);
    strcpy(label,d.label);
    selections = d.selections ;
    playtime = d.playtime;

    return *this;
}

程序详见:https://github.com/ghostxiu/CplusplusPrimerPlus6thEditions/tree/master/Chapter13/cd1.cc
四、其他
还要注意赋值运算符和转换函数的区别。