解释一些简单的代码

时间:2011-12-23 15:39:45

标签: c++ string

以下是考试题目:

    /* 1 */ string s1 = "FRED";
    /* 2 */ string s2 = s1;
    /* 3 */ string s3 = "DERF";
    /* 4 */ s3 = s1;
  

对于上面的第二行和第四行,请说明该行的语句类型。将       他们调用类字符串的相同成员函数? [5分]

所以我的答案是:

  • 第2行使用copy constructor初始化一个新的字符串对象s2,将所有成员变量从s1复制到s2中。
  • 第4行也是将所有成员变量从s1复制到s2,但它会重载assignment operator (operator=)来执行此操作。

因此他们都在调用2个不同的成员函数。

以上是否可以接受答案?我有什么可以补充的吗?我有错误的想法吗?

2 个答案:

答案 0 :(得分:3)

关于第4行

的答案

你无法确定它实际上是否使用了复制构造函数,而且绝对不应该。

为什么在将std::string::operator=中的数据直接复制到s1时,可以在s3内创建临时对象?

您撰写的关于operator=的内容是正确的,但遗漏了您在那里撰写的有关复制构造函数的内容。 new 对象没有初始化,因此不应该调用构造函数。


您还应该省略关于制作所有成员变量的副本的声明,但不一定是真的。

当涉及std::string之类的对象时,有指针作为未复制的成员,但是它们指向的内存被复制到新的内存空间(由目标对象使用)


他/她的帖子后OP编辑..

OP刚刚更改了他的帖子,删除了我在帖子的第一部分中发表的评论。

答案 1 :(得分:2)

  

.Line 4也使用复制构造函数将所有成员变量从s1复制到s2

没有。第4行调用了复制赋值运算符,而不是复制构造函数。

在对象的声明中初始化时调用构造函数。第4行没有声明任何内容,因此它调用operator=的副本赋值。即使该类没有重载operator=,编译器也会为您生成一个,然后它将被调用。所以在任何情况下,第4行都不能调用copy-constructor。

请注意,如果您认为班级对象的复制作业没有意义,则可以为您的班级停用operator=。要禁用此功能,您需要做的就是在类的私有部分声明operator=,然后不为它提供任何定义。像这样:

struct A
{
       A(A const &) {} //copy through copy-constructor is allowed
   private:
       A& operator=(A const &);//copy through copy-assignment is disallowed
};

A x
A y(x); //ok  - copy-constructor is allowed
y = x;  //error - copy-assignment is disallowed

同样,您可以同时禁用:copy-constructor和copy-assignment。例如,the standard library has disabled copy-semantics for all stream classes

在C ++ 11中,您可以明确禁用copy-semantic:

struct B
{
   private:
       B(B const &) = delete;
       B& operator=(B const &) = delete;
};

B禁用了复制语义,=delete的使用使其显式化。它还增加了代码的可读性,并清楚地揭示了程序员的意图。