我使用的代码中使用的这两者有什么区别 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 中,而如果通过复制构造函数发生同样的事情,object2 的内容仍然存在(我的意思是正如这个词所暗示的“复制”)。
注意:顺便说一下,我的代码在 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 构造函数。
如果一个对象只是被赋值,而不是在同一语句中被创建,那么它会调用赋值(复制赋值)运算符。
编译器报错是因为:
普通字符串字面量的类型为“n 个常量字符数组”。并且不推荐使用字符串文字 (4.2) 从 const 到非常量限定的隐式转换。
引用文献:
C++ 标准部分 [2.13.4/2]:
一个普通的字符串文字具有类型array of n const char
,其中 n 是如下定义的字符串的大小;它具有静态存储持续时间 (3.7) 并使用给定的字符进行初始化。
附件 D 部分 [D.4/1]
string literals
(4.2) 从const
到non-const
资格的隐式转换已弃用。
所以为了避免警告你应该使用:
static const char *monthName[13]
^^^^^^^
关于c++ - 默认复制构造函数和默认赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6995278/