以下是考试题目:
/* 1 */ string s1 = "FRED";
/* 2 */ string s2 = s1;
/* 3 */ string s3 = "DERF";
/* 4 */ s3 = s1;
对于上面的第二行和第四行,请说明该行的语句类型。将 他们调用类字符串的相同成员函数? [5分]
所以我的答案是:
copy constructor
初始化一个新的字符串对象s2,将所有成员变量从s1复制到s2中。assignment operator (operator=)
来执行此操作。因此他们都在调用2个不同的成员函数。
以上是否可以接受答案?我有什么可以补充的吗?我有错误的想法吗?
答案 0 :(得分:3)
你无法确定它实际上是否使用了复制构造函数,而且绝对不应该。
为什么在将std::string::operator=
中的数据直接复制到s1
时,可以在s3
内创建临时对象?
您撰写的关于operator=
的内容是正确的,但遗漏了您在那里撰写的有关复制构造函数的内容。 new 对象没有初始化,因此不应该调用构造函数。
您还应该省略关于制作所有成员变量的副本的声明,但不一定是真的。
当涉及std::string
之类的对象时,有指针作为未复制的成员,但是它们指向的内存被复制到新的内存空间(由目标对象使用)
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
的使用使其显式化。它还增加了代码的可读性,并清楚地揭示了程序员的意图。