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

标签 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 中,而如果通过复制构造函数发生同样的事情,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) 从constnon-const 资格的隐式转换已弃用。

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

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

关于c++ - 默认复制构造函数和默认赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6995278/

相关文章:

c++ - 在同一个函数中使用不同的命名空间

C++将整数数组分配给相同大小的空整数数组

c++ - 何时使用 if 语句选择多个循环而不是单个循环

c++ - 如何将二维数组传递给函数 (C++)?

C++ 初始化类成员构造函数

c++ - Boost Asio 示例 - 奇怪的 C++ 语法

php - 关于PHP中的内存和变量分配

c++变量重新分配被代码忽略

c++ - 在折叠表达式中使用 lambda 时出现 "Uninitialized captured reference"错误 - clang 与 gcc

java - 如何在 java 中跳过从祖 parent 调用 super 的继承级别?