使用构造函数语法初始化引用
Initializing a reference with constructor syntax
观察以下类:
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);
你不是在构造一个新对象,你只是初始化了一个引用(即你设置了它指向的对象的地址)。
相关文章:
- C++在构造函数处用表达式初始化引用
- 我可以从取消引用"new"的返回值初始化引用吗
- 通过用户定义的转换初始化引用
- 为什么我可以在初始化引用后重新绑定引用?
- TBB 编译器错误 -"my_task":必须初始化引用
- Visual Studio 2017 允许在构造函数中使用自身初始化引用成员.真的是合法的C++吗?
- 为构造函数初始化引用实例变量提供默认值
- 在构造过程中获取类成员的未初始化引用是否合法
- 在C++中初始化引用
- 在动态分配的结构中初始化引用
- 使用三元运算符初始化引用变量
- 如何在 c++ 中显式初始化引用
- 初始化引用时何时以及为何获得副本
- 初始化C++引用-为什么不使用运算符的地址
- 在C++中初始化引用和变量
- 在函数参数中分配/初始化引用
- 在 C++ 中初始化引用不起作用,但初始化 const 引用有效,为什么?
- 类组合构造函数 d 必须显式初始化引用成员
- 用对tuple的引用初始化引用的元组
- 为什么在c++中不能重新初始化引用