2012-11-26 67 views
0

我在列表中找到了关于C++的练习,只是无法解决它。那就是: 比方说,我们有如下指令:ObjA = ObjB in C++

ObjA = ObjB; 

在这ObjA是ClassA的一个对象,ObjB是ClassB的的对象,这将正常运行,当且仅当有:
A.在ClassA的
B.在ClassB的A转换功能的转换函数在ClassA的
D.一个构造
C.一个构造在ClassB的

可以有多个正确的答案。 这个练习的问题是它们都是对象,理论上你不能改变对象内的实例 - 这就是我认为'='会在那里做的事情。因为可以有多个正确答案,所以我认为没有一个答案是正确的。但我不确定。

回答

1

这将正常运行。如果这些是真的:

  1. 有一个在ClassA赋值运算符这需要类型的参数ClassB
  2. 有一个在ClassA赋值运算符这需要的参数键入X,并在ClassB中有X类型的转换功能。
  3. ClassB中有一个ClassA类型的转换函数。

我不知道如果这些匹配你选择的ABCD。

1

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

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

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

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

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

,我发现这个锻炼一下C++在列表

要敢说真话,如果这个练习是代表你在名单上找到质量的,它可能是值得考虑去别的地方了你的C++练习。

+0

好吧,那是因为operator =被重载以接受(const)char *。一个漂亮的阅读(不是NPE),但在我眼中是栾尼科是这样的:http://www.icu-project.org/docs/papers/cpp_report/the_anatomy_of_the_assignment_operator.html – Najzero

2

你说:

可以有多个正确答案。

但直接由

矛盾当且仅当

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

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


编辑:哦,我没有考虑到可能的继承关系(所谓的切片分配),但我看到的是,在其他的答案。在你给出的答案中没有提到它。我认为你应该找到一些更好的优质培训材料......