我一直在阅读“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?这没有意义???为什么书从不使用直接初始化作为参考? 谢谢你的关注!
答案 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) { ... }
并调用它,然后编译器只是将指针传递给函数,并且什么都不创建。