我使用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
答案 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-const
到string literals
资格的隐式转换已弃用。
所以要避免警告你应该使用:
static const char *monthName[13]
^^^^^^^
答案 1 :(得分:1)
static char *monthName[13]
可以/应该是
static const char *monthName[13]
避免警告。
答案 2 :(得分:1)
默认复制构造函数和默认赋值运算符之间的区别在于,当调用赋值运算符时,接收对象的成员已经使用值初始化,而您只是将它们替换为第二个值中的值的副本宾语。使用复制构造函数,成员将初始化为第二个对象中成员的副本。第二个对象应完全不受任何操作的影响。
但是,您没有在代码中使用赋值运算符,而是使用了复制构造函数。如果你这样做了:
Date temp;
temp = *this;
然后你将使用赋值运算符。