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

时间:2011-08-09 11:15:21

标签: c++ constructor variable-assignment copy-constructor

我使用here代码中使用的其中任何一个有什么区别。(第44行和第45行都可以正常工作)

摘录:

Date temp = *this;  //ASSIGNMENT OPERATOR CALL(PROVIDED BY COMPILER)
//Date temp(*this); //COPY CONSTRUCTOR CALL(PROVIDED BY COMPILER)

我的意见:在分配期间是否像object1 = object2; object2的内容被删除并放在object1中,而如果同样的事情通过复制构造函数发生,对象2的内容仍然存在(我的意思就像单词暗示“复制”)。

注意:顺便说一句,我的代码在Microsoft Visual C ++ 2008中编译得很好,但它发出警告

  prog.cpp: In function ‘std::ostream& operator<<(std::ostream&, const Date&)’:
  prog.cpp:103: warning: deprecated conversion from string constant to 
在ideone.com。其中的原因。

3 个答案:

答案 0 :(得分:4)

Date temp = *this; 
Date temp(*this); 

两个调用复制构造函数,
首先称为复制初始化&amp;第二个称为直接初始化

记住这个的简单规则是:
如果在同一语句中创建和初始化对象,则它调用Copy构造函数。

如果刚刚分配了一个对象而没有在同一个语句中创建它,则它会调用Assignment(Copy Assignment)运算符。


编译器抱怨因为:

普通字符串文字的类型为“n const char数组”。

不推荐使用从字符串文字(4.2)到const的非const限定的隐式转换。

参考文献:
C ++标准部分[2.13.4 / 2]:
普通字符串文字的类型为array of n const char,其中n是字符串的大小,如下所示;它具有静态存储持续时间(3.7)并使用给定的字符初始化。

附录D部分[D.4 / 1]
const(4.2)的non-conststring literals资格的隐式转换已弃用。

所以要避免警告你应该使用:

static const char *monthName[13]
      ^^^^^^^ 

答案 1 :(得分:1)

static char *monthName[13]

可以/应该是

static const char *monthName[13]

避免警告。

答案 2 :(得分:1)

默认复制构造函数和默认赋值运算符之间的区别在于,当调用赋值运算符时,接收对象的成员已经使用值初始化,而您只是将它们替换为第二个值中的值的副本宾语。使用复制构造函数,成员将初始化为第二个对象中成员的副本。第二个对象应完全不受任何操作的影响。

但是,您没有在代码中使用赋值运算符,而是使用了复制构造函数。如果你这样做了:

Date temp;
temp = *this;

然后你将使用赋值运算符。