【问题标题】:Class assignment operator and copy constructor类赋值运算符和复制构造函数
【发布时间】:2014-08-13 13:41:05
【问题描述】:

试图了解如何制作赋值类运算符。成员变量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 呢?

【问题讨论】:

  • 编译代码,选择生成asm代码,你就知道了。

标签: c++


【解决方案1】:

当您不在复制赋值运算符中通过引用传递参数时,编译器会复制您传递的参数,并且函数使用该副本。调用的函数是复制赋值运算符无所谓,所有函数都一样。

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

至于返回值,同样的事情发生在那里:编译器创建一个返回值的副本。如果你正确地实现了你的复制构造函数来真正复制一些东西,结果会有所不同。

【讨论】:

    【解决方案2】:

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

    默认构造函数

    复制构造函数

    赋值运算符重载

    析构函数

    现在在您的第二种情况下,您已经从参数中删除了引用,因此它是按值传递的情况,它是通过调用复制构造函数来实现的。

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

    【讨论】:

      【解决方案3】:

      &value == this 的测试在 value 参数按值而不是按引用传递时毫无意义,因为在调用成员函数之前在堆栈上创建了一个新的 turbo 实例,并且地址该实例的地址显然不等于调用对象的地址。

      【讨论】:

        猜你喜欢
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 2013-04-13
        • 2012-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多