使用构造函数语法初始化引用

时间:2014-03-18 06:40:36

标签: c++

观察以下课程:

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;之间是否存在差异(可忽略不计)?

3 个答案:

答案 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);

您没有构建新对象,只需初始化一个引用(即您设置它指向的对象的地址)。