我可以使用=运算符将一个对象的值分配给另一个对象,而不会使运算符重载吗?

时间:2016-09-29 05:30:41

标签: c++

这是最近在我的课程中出现的T / F问题,我发现有点令人困惑。

教科书指出:

  

=运算符可用于将一个对象的数据分配给另一个对象,或者用另一个对象的数据初始化一个对象。默认情况下,一个对象的每个成员都复制到另一个对象中的对应成员。

逐字的问题是:

  

除非重载运算符,否则不能使用=运算符将一个对象的值分配给另一个对象。 T / F?

从教科书的特定段落来看,我回答错误。然而,事实证明,测验答案实际上是正确的。

当我在网上查询问题时,我看到其他来源也将答案列为“假”。当然,这些只是通用的闪卡/测验网站,所以我不会在其中放入太多的股票。

基本上,我只是好奇真正的答案是为了将来的学习目的。

P.S。:教科书后来继续陈述:“为了改变赋值运算符的工作方式,它必须重载。运算符重载允许你在与类一起使用时重新定义现有运算符的行为 对象。“

我觉得这是相关的并支持“真实”的答案,但我不太确定。

5 个答案:

答案 0 :(得分:2)

声明

  

除非重载运算符,否则不能使用=运算符将一个对象的值分配给另一个对象。

...很简单,因为你可以分配到例如一个{{1}}变量。这是一个对象。在C ++中。

可能他们打算写“类型对象”,但即便如此也是如此。例如。任何POD(Plain Old Data)类类型对象都是可分配的,并且没有重载的赋值运算符。

但是,有些情况下您需要或需要禁止或负责转让。

答案 1 :(得分:2)

如果您没有自己实现赋值运算符,编译器将为您生成一个,它将数据从源复制到目标,在可能/必要的情况下调用类成员的赋值运算符。

如果您的班级例如,这不起作用。功能const成员,如果您的类包含指向动态分配对象的指针,则不会产生所需的结果。

所以,我也会说这句话是假的。

答案 2 :(得分:1)

这是一个棘手的问题。句法答案是“假”,但语义答案是“可能”。

struct Foo
{
   int a;
   double b;
};

Foo foo1;
Foo foo2;
foo2 = foo1;    // Ok in both senses.

struct Bar
{
   Bar() : arr(new int[20]) {}
   ~Bar() { delete [] arr; }
   int* arr;
};

Bar bar1;
Bar bar2;
bar2 = bar1;  // Ok in syntax not in semantics
              // This will lead to UB

答案 3 :(得分:1)

C++中,当涉及User-Defined Typesclassstruct时,最好为类型重载operator=。将default assignment operatorclassstruct对象一起使用将涉及Shallow Copy。当Shallow Copyclass对象在其中动态分配内存时,struct有时会导致未定义的行为。

operator=class类型适当地重载struct会导致Deep Copy这是将对象ObjA分配给对象{{1}的正确方法(ObjB)当ObjB = ObjAObjA是某些ObjBclass的对象并且在其中包含动态分配的内存时。{/ p>

=运算符可用于将一个对象的数据分配给另一个对象,或者用另一个对象的数据初始化一个对象。默认情况下,一个对象的每个成员都复制到另一个对象中的对应成员。struct的对象内部只有静态基础类型的数据时,这是正确的。在这里,

  • by static 表示对象的所有内存需求仅在编译时固定。

您不能使用default =运算符将一个对象的值分配给另一个对象,除非您重载运算符。class/struct的对象有一些动态分配时,这是真的内存,可能使用class/struct

有关更多参考,请参阅: What is the difference between a deep copy and a shallow copy?

答案 4 :(得分:0)

  

除非重载运算符,否则不能使用=运算符将一个对象的值分配给另一个对象。 T / F?

     

答案:F

您可以将一个对象的值分配给另一个对象而不会重载=运算符,因为默认情况下编译器会定义该类的赋值运算符,除了下面的

  • 您已明确声明了一个复制赋值运算符(对于类X,运算符=采用X,X&或const X&))
  • 您的类中有一个不可赋值的成员(例如引用,const对象或没有或无法访问赋值运算符的类)

但是你需要理解为什么在你拥有用户定义的成员或具有动态内存分配的情况下重载赋值运算符是必须的,这对于浅和深拷贝的读取概念