我的程序运行良好,可以复制对象,但是当我使用复制分配(=)时,它仍然可以正常运行.为什么不给错误
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?
我没有超载(=
(操作员,但仍在代码框架中运行良好。但是,当我在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外壳上不起作用的原因可能是由于各种未定义的行为所致(但可能不限于(:
- 违反三个规则:三个规则是什么?
- 您的
dummy(string ab)
构造函数存储指向临时变量的指针。ptr = &ab;
应该是*ptr = ab;
- 您的
dummy(dummy& abc)
复制构造器应为dummy(const dummy& abc)
,ptr = &(abc.print());
应该是*ptr = abc.print();
- 您的默认构造函数
dummy()
应初始化ptr
至nullptr
-
print()
应该检查ptr
不是null。
它是C 规范的一部分,默认情况下,如果没有用户定义的复制分配运算符包含在类定义中,则编译器将生成默认的复制分配运算符。还有其他几个运算符和功能可以自动生成。其他是默认构造函数,复制构造函数,一个移动构造函数,移动分配运算符和驱动器。
复制分配的默认行为是复制对象的每个非静态成员 - 如果对象是POD类型,或者是否确实执行了该副本之间的区别会员副本,但结果是相同的。关于情况,也无法生成默认复制行为的情况:如果类具有const的非静态成员;如果它具有非静态成员,该成员本身没有副本分配运算符,等等。
从C 11开始,您可以选择不让编译器通过将它们分配给关键字 delete 。。
来生成这些特殊成员函数例如,如果您添加
,则在代码中dummy& operator=(const dummy &) = delete;
对于虚拟的定义,该程序将不再编译。
- 为什么复制而不是移动数据元素?
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 该值将被复制而不是移动.为什么?
- 我的程序运行良好,可以复制对象,但是当我使用复制分配(=)时,它仍然可以正常运行.为什么不给错误
- 为什么不在这个具有自动返回类型的函数中省略复制?
- 为什么不调用复制构造函数,但在此代码中调用默认构造函数
- 为什么不能用memcpy复制非POD对象?
- 为什么重新分配矢量复制而不是移动元素
- 如果引发的异常始终是异常对象的副本,为什么不调用此复制构造函数?
- 为什么不允许复制构造函数按值传递
- 为什么不调用复制构造函数将临时对象复制到新定义的对象
- 为什么不是只有一个?复制构造函数和赋值操作符
- 为什么不调用复制构造函数
- 为什么不能从析构函数抛出异常,但可以从复制构造函数抛出异常
- 为什么不复制由单个shared_ptr组成的类呢?
- 当按值返回列表初始化的对象时,为什么不调用复制构造函数?
- 为什么不调用复制构造函数?
- 为什么不通过std::cin复制并粘贴到控制台中读取会产生与从std::ifstream读取相同的结果呢
- 为什么不允许复制字符串流
- 为什么不调用复制构造函数