默认的Copy构造函数和默认的赋值运算符
default Copy constructer and default assignment operator
我在这里使用的代码中使用的这两种方法之间有什么区别。(第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(从const
到non-const
资格的隐式转换已被弃用
所以为了避免警告你应该使用:
static const char *monthName[13]
^^^^^^^
static char *monthName[13]
可以/应该是
static const char *monthName[13]
以避免警告。
默认的复制构造函数和默认的赋值运算符之间的区别在于,当调用赋值运算符时,接收对象的成员已经用值初始化,而您只是用第二个对象中的值的副本替换它们。使用复制构造函数,成员被初始化为第二个对象中成员的副本。第二个对象应该完全不受任何一个操作的影响。
但是,您在代码中没有使用赋值运算符,而是使用了复制构造函数。如果你这样做了:
Date temp;
temp = *this;
那么您将使用赋值运算符。
- 默认赋值运算符如何在实际 STL 中实现
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- C++不同类型的默认赋值运算符
- 将默认赋值运算符声明为 constexpr:哪个编译器是正确的?
- 默认赋值运算符有权访问基类的私有成员
- 错误:非静态引用成员"std::ostream&Student::out",无法使用默认赋值运算符
- 默认的复制构造函数和复制赋值运算符给出奇怪的错误
- 在这种情况下,我们需要禁用默认的复制构造函数和赋值运算符
- 错误:非静态引用成员,无法使用默认赋值运算符
- 如果成员具有非平凡的noexcept赋值运算符,则默认的移动赋值不能显式为noexcept
- 外部C结构的C++默认复制/移动赋值运算符不是常量
- 如果类具有引用数据成员,为什么编译器不合成默认赋值运算符
- 模板赋值运算符不替换默认赋值运算符
- 删除默认C++复制和移动构造函数和赋值运算符的缺点
- 具有不同模板参数的模板类的默认赋值运算符
- 重载赋值运算符或使用默认运算符
- 为什么我不能在 C++ 中使用模板版本覆盖默认的复制构造函数和赋值运算符
- c++默认的复制和赋值运算符
- 当类成员是引用时,是否无法生成默认赋值运算符?(在C++中)
- "非静态引用成员,不能使用默认赋值运算符"