类赋值运算符和复制构造函数

时间:2014-08-13 13:41:06

标签: c++

试图了解如何创建赋值类操作符。成员变量constant_name用于标识对象。成员变量changeable_name用于在分配期间产生影响。我需要这个来了解谁的影响是什么以及结果是什么。每个对象在创建过程中都会获得唯一constant_name

    class turbo
        {
    static string m;


    public:

        string changable_name ="";
        string constant_name  ="";
        void nm()
                {
                m=m+"A";
                changable_name=m;
                constant_name=changable_name;
                };

        void printID()
            {
                printf("constant_name=%s changable_name=%s ",constant_name.c_str(),changable_name.c_str());
            };


        turbo() {
                nm();
                printID();
                printf("default constructor \n");
                };

        turbo & operator = (turbo & value){ printID(); printf("= operator\n"); if (!(&value==this)) { changable_name = value.constant_name; } ;  return *this; }

        turbo (turbo&) {nm(); printID(); printf("copy constructor\n");}

        };


    string turbo::m;



int main( int argc, char ** argv )
{
    turbo f;
    turbo ff;

    f=ff;

    printf("--- result ---\n");
    f.printID();
}

当在顶部的代码中描述=运算符时,我有输出:

 constant_name=A changable_name=A default constructor 
 constant_name=AA changable_name=AA default constructor 
 constant_name=A changable_name=A = operator
 --- result ---
 constant_name=A changable_name=AA 

字段changable_name已从AA变为A,这很好。

现在,如果我删除turbo value中的参考标记:

turbo & operator = (turbo  value){ printID(); printf("= operator\n"); if (!(&value==this)) { changable_name = value.constant_name; } ;  return *this; }

我在输出中有以下内容:

constant_name=A changable_name=A default constructor 
constant_name=AA changable_name=AA default constructor 
constant_name=AAA changable_name=AAA copy constructor
constant_name=A changable_name=A = operator
--- result ---
constant_name=A changable_name=AAA 

创建了新对象AAA并将其分配给对象AAA根本没有影响力。为什么编译器决定激活复制构造函数然后赋值运算符?我想在" ="的右边激活了复制构造函数。操作

另一个案例。

现在,如果我删除turbo operator中的参考标记:

turbo operator = (turbo & value){ printID(); printf("= operator\n"); if (!(&value==this)) { changable_name = value.constant_name; } ;  return *this; }

我在输出中有以下内容:

constant_name=A changable_name=A default constructor 
constant_name=AA changable_name=AA default constructor 
constant_name=A changable_name=A = operator
constant_name=AAA changable_name=AAA copy constructor
--- result ---
constant_name=A changable_name=AA 

这让我很困惑。我想AAA是在=的左侧创建的。 AAA在任务中根本没有采取任何行动。结果A已分配给AA。但为什么需要创建AAA呢?

3 个答案:

答案 0 :(得分:1)

如果您未在复制赋值运算符中通过引用传递参数,则编译器复制您传递的参数,并且该函数使用该副本。调用的函数是复制赋值运算符并不重要,它对所有函数都是相同的。

搜索并阅读有关按值传递和按引用传递的详细信息。

对于返回值,同样的事情发生在那里:编译器创建返回值的副本。如果您已正确实现了复制构造函数以实际复制某些内容,那么结果将会有所不同。

答案 1 :(得分:0)

&value == this参数通过-value而非by-reference传递时,value上的测试毫无意义,因为在成员函数之前在堆栈上创建了新的turbo实例被调用,该实例的地址显然不等于调用对象的地址。

答案 2 :(得分:0)

如果你没有在你的类中定义下面的函数,那么编译器将提供它自己的版本

默认构造函数

复制构造函数

赋值运算符重载

现在在第二种情况下,您已从参数中删除了引用,因此它是一个传递值的情况,它是通过调用copy-constructor实现的。

在第三种情况下,它是按值而不是按引用返回,因此复制ctor在=运算符的作业完成后再次被调用,因此输出。