直接初始化和复制初始化参考

时间:2012-12-19 12:54:52

标签: c++

我一直在阅读“C ++入门”。对于对象的初始化,C ++支持两种形式的初始化:直接和复制。 但本书并未参考初始化参考。在书中我从未见过直接初始化(如果存在)引用。所有的副本都是:

int i;
int &j = i;//but not int &j(i);which also works in my experiment

我想知道在下面进行初始化引用是一样的。 对于以下代码:

string null_book = "9-999-99999-9";

初始化进程首先创建一个临时字符串对象tmp(例如),它将使用c样式字符串参数进行初始化,然后使用复制构造函数初始化变量null_book。这对我来说很有意义。 对于这个:

int &j = i;

将以同样的方式初始化ref?那将是一个临时参考它(例如)由i初始化然后用t初始化j?这没有意义???为什么书从不使用直接初始化作为参考? 谢谢你的关注!

2 个答案:

答案 0 :(得分:4)

术语复制初始化直接初始化是C ++的语法的一部分。他们没有立即告诉你代码生成的类型。标准描述了任何语法结构的含义,初始化的上下文有很多不同的特殊后果,具体取决于正在初始化的事物的类型。

特别是对于基本类型,指针类型和引用类型,直接初始化和复制初始化(语法结构!)具有完全相同的效果。也就是说,基本和指针类型使用初始化程序的值初始化,引用绑定到初始化程序引用的对象:

int a1 = 5;
int a2(5);      // same thing

Foo * p1 = &x;
Foo * p2(&x);   // same thing

Bar & b1 = y;
Bar & b2(y);    // same thing

(但是,对于用户定义的类型 区分了直接初始化和复制初始化,尽管它是一个微妙的,通常并不重要。)

答案 1 :(得分:3)

C ++中的引用只是一个戴着滑稽帽子的指针。声明:

TYPE& x = y;

总是等同于:

TYPE* const x = &y;

所有引用都可以帮助您输入*个字符并声明您的信念永远不会为空。因此初始化是微不足道的,因为它是指针的初始化,而不是对象,并且没有复杂的对象(临时或其他)来处理。

这是概念模型;当然,还有优化。如果你声明一个像:

这样的函数
void takeARef(FOO const& ref) { ... }

并调用它,然后编译器只是将指针传递给函数,并且什么都不创建。