默认的Copy构造函数和默认的赋值运算符

default Copy constructer and default assignment operator

本文关键字:默认 赋值运算符 Copy 构造函数      更新时间:2023-10-16

我在这里使用的代码中使用的这两种方法之间有什么区别。(第44行和第45行都很好(

摘录:

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

我的看法:是不是在分配过程中像object1=object2;对象2的内容被删除并放置在对象1中,而如果通过复制构造函数发生同样的事情,对象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上。原因有很多。

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

两者都调用复制构造函数,
第一个称为复制初始化&第二个称为直接初始化

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

如果一个对象刚刚被赋值,而不是在同一语句中创建的,那么它调用Assignment(Copy Assignment(操作符。


编译器抱怨是因为:

普通字符串文字的类型为"array of n const char"。不赞成使用字符串文字(4.2(从常量到非常量限定的隐式转换。

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

附录D第[D.4/1]
string literals(4.2(从constnon-const资格的隐式转换已被弃用

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

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

可以/应该是

static const char *monthName[13]

以避免警告。

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

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

Date temp;
temp = *this;

那么您将使用赋值运算符。