观察以下课程:
class Object {
public:
Object() {}
Object(const Object & other) = delete;
void setName(const std::string & name) {
this->name = name;
}
void printName() {
std::cout << name << std::endl;
}
private:
std::string name = "Janice";
};
现在观察此代码:
int main() {
Object o;
Object p (o);
return 0;
}
我知道前面的代码调用了隐式复制构造函数Object(const Object & other)
。因此,如果我们删除复制构造函数,我们会收到错误:
// delete copy constructor
class Object {
public:
Object(const Object & other) = delete;
错误:使用已删除的函数&#39; Object :: Object(const Object&amp;)&#39;
但是如果我们将p改为参考怎么办?
int main() {
Object o;
Object & p (o);
return 0;
}
代码编译正常,没有复制构造函数或警告。当我们使用括号()
语法构造引用时,实际发生了什么?
Object & p (o);
和Object & p = o;
之间是否存在差异(可忽略不计)?
答案 0 :(得分:2)
使用括号
()
语法构造引用时实际发生了什么?
初始化引用以引用括号中表达式的结果。
Object & p (o);
和Object & p = o;
之间是否存在差异(可忽略不计)?
没有。引用标准(C ++ 11 8.5 / 13):
初始化的形式(使用括号或=)通常是无关紧要的,但在初始化程序或正在初始化的实体具有类类型时很重要
因此对于参考类型并不重要。 (对于类类型,括号通过构造函数提供直接初始化,而=
通过用户定义的转换提供复制初始化。
答案 1 :(得分:0)
类型为Object&
,这是一个参考。 p
然后是一个引用,当它被启动时,将使它绑定到初始化器。
您可以通过比较它们的地址来测试它。请记住,两个不同的对象不能具有相同的地址,但只有别名的引用与它所引用的对象具有相同的地址。
assert(&p == &o); // p should refer to o
初始化与
相同Object& p = o; // Still binds `o` to `p`
答案 2 :(得分:0)
执行此操作时:
Object & p (o);
您没有构建新对象,只需初始化一个引用(即您设置它指向的对象的地址)。