我的程序运行良好,可以复制对象,但是当我使用复制分配(=)时,它仍然可以正常运行.为什么不给错误

My program runs fine and I am able copy the object however when I used the copy assignment (=) it still runs fine. Why is it not giving error?

本文关键字:复制 为什么不 分配 错误 正常运行 运行 程序 对象 我的      更新时间:2023-10-16

我没有超载(=(操作员,但仍在代码框架中运行良好。但是,当我在C 外壳上运行此代码时,它已成功编译,但是输出为空白。有人可以解释一下为什么即使我没有编写复制分配的代码?

也是另一个问题...

如果在第1行上,我将返回类型更改为 string而不是string&,则会显示一个错误(关于临时变量(,但是如果我将第2行的代码更改为 dummy(dummy& abc : ptr(new string (abc.print())),则程序运行良好(尽管行1的返回类型是第1行的返回类型string(。为什么这样?

class dummy {
  string* ptr;
 public:
  dummy(string ab) {
    ptr = new string;
    ptr = &ab;
  }
  ~dummy() { delete ptr; }
  string& print() { return *ptr; }  // line1
  dummy(dummy& abc) {
    ptr = new string;
    ptr = &(abc.print());
  }  // line2
  dummy(){};
};
int main() {
  dummy x("manzar");
  dummy y;
  y = x;
  cout << x.print();
  cout << "n" << y.print();
}

我没想到它运行良好,但是运行良好。它将内容从x复制到y

编译器会自动为您生成分配运算符时,代码编译。请参阅https://en.cppreference.com/w/cpp/language/copy_assignment,以了解其何时和没有发生的完整规则。另请参阅三个规则是什么?

您的代码在CPP外壳上不起作用的原因可能是由于各种未定义的行为所致(但可能不限于(:

  1. 违反三个规则:三个规则是什么?
  2. 您的dummy(string ab)构造函数存储指向临时变量的指针。ptr = &ab;应该是*ptr = ab;
  3. 您的dummy(dummy& abc)复制构造器应为dummy(const dummy& abc)ptr = &(abc.print());应该是*ptr = abc.print();
  4. 您的默认构造函数dummy()应初始化ptrnullptr
  5. print()应该检查ptr不是null。

它是C 规范的一部分,默认情况下,如果没有用户定义的复制分配运算符包含在类定义中,则编译器将生成默认的复制分配运算符。还有其他几个运算符和功能可以自动生成。其他是默认构造函数,复制构造函数,一个移动构造函数,移动分配运算符和驱动器。

复制分配的默认行为是复制对象的每个非静态成员 - 如果对象是POD类型,或者是否确实执行了该副本之间的区别会员副本,但结果是相同的。关于情况,也无法生成默认复制行为的情况:如果类具有const的非静态成员;如果它具有非静态成员,该成员本身没有副本分配运算符,等等。

从C 11开始,您可以选择不让编译器通过将它们分配给关键字 delete 。。

来生成这些特殊成员函数

例如,如果您添加

,则在代码中
dummy& operator=(const dummy &) = delete;

对于虚拟的定义,该程序将不再编译。