0

我在一个列表中找到了这个关于 C++ 的练习,但无法解决它。就是这样:假设我们有以下指令:

ObjA = ObjB; 

其中 ObjA 是 ClassA 的对象,而 ObjB 是 ClassB 的对象,当且仅当存在以下情况时,它将正确运行:
A. ClassA 中
的转换函数 B. ClassB 中的转换函数
C. ClassA 中的构造函数
D . ClassB 中的构造函数

可以有多个正确答案。我对这个练习的问题是它们都是对象,并且从理论上讲,你不能更改对象内部的实例——这就是我认为 '=' 会在那里做的事情。由于可能有多个正确答案,因此我认为没有一个是正确的。但我不确定。

4

3 回答 3

2

你说:

可以有多个正确答案。

但这与

当且仅当

无论如何,您需要从右侧到左侧的隐式转换。

这种转换可以表示为 rhs 中的转换运算符。类型,或作为 lhs 中的构造函数。类型,或者在这种情况下(赋值)作为 lhs 中的特殊赋值运算符。类型。


编辑:哦,我没有考虑可能的继承关系(所谓的切片分配),但我只是在另一个答案中看到了这一点。在您给出的答案替代方案中没有提到它。我认为您应该找到一些质量更好的培训材料……

于 2012-11-26T13:36:58.240 回答
1

我对这个练习的问题是它们都是对象,并且从理论上讲,你不能更改对象内部的实例——这就是我认为 '=' 会在那里做的事情。

这是不正确的。您当然可以在两个对象之间使用赋值运算符,在某些情况下,即使它们是不同的类型。这就是复制构造函数、赋值运算符和转换运算符的全部内容。

这是一个非常简单的示例,演示了一些可能性:

std::string s1, s2;
const char* cstr = ...;
s1 = s2;
s1 = cstr;

也就是说,我认为这个问题的措辞非常糟糕。具体来说,“当且仅当”部分意味着没有一个答案是完全正确的(即使其中一些是部分正确的)。它也完全忽略了 和 之间可能存在继承关系的ClassA可能性ClassB

我在一个列表中找到了这个关于 C++ 的练习

老实说,如果这个练习代表了你在该列表中找到的质量,那么考虑到其他地方进行 C++ 练习可能是值得的。

于 2012-11-26T13:30:53.197 回答
1

如果其中任何一个为真,这将正确运行:

  1. 有一个赋值运算符,ClassA其中接受一个类型的参数ClassB
  2. 有一个赋值运算符,ClassA其中接受一个类型的参数,并且有一个可以输入的X转换函数。XClassB
  3. 有一个转换函数可以输入ClassAClassB

我不知道这些如何/是否与您拥有的 ABCD 选择相匹配。

于 2012-11-26T13:41:04.127 回答