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

Initializing a reference with constructor syntax

本文关键字:初始化 引用 语法 构造函数      更新时间:2023-10-16

观察以下类:

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;

错误:使用已删除的函数'Object::Object(const Object&)'

但是如果我们把p改成一个引用呢?

int main() {
  Object o;
  Object & p (o);
  return 0;
}

如果没有复制构造函数或警告,代码可以正常编译。当我们用括号()语法构造引用时,实际上发生了什么?

Object & p (o);Object & p = o;是否有差异(可忽略)

当我们用括号()语法构造引用时,实际发生了什么?

引用被初始化为引用括号内表达式的结果。

Object & p (o);Object & p = o;之间是否有差异(可以忽略)?

。引用标准(c++ 11 8.5/13):

初始化的形式(使用括号或=)通常是无关紧要的,但当初始化器或被初始化的实体具有类类型

时,则很重要。

所以这对引用类型来说无关紧要。(对于类类型,括号通过构造函数给直接初始化,而=通过用户定义的转换给复制初始化)。

类型为Object&,为引用。因此,p是一个引用,当初始化时,它将绑定到初始化器。

你可以通过比较它们的地址来测试它。请记住,两个不同的对象不能有相同的地址,但是引用(只是别名)与它所引用的对象有相同的地址。

assert(&p == &o);   // p should refer to o

初始化与

相同
Object& p = o;   // Still binds `o` to `p`

当你这样做的时候:

Object & p (o);

你不是在构造一个新对象,你只是初始化了一个引用(即你设置了它指向的对象的地址)。