smw*_*dia 28 c++ pointers language-design
可能重复:
C++中指针变量和引用变量之间的差异
我正在阅读Stanley Lippman撰写的"Inside the C++ Object Model"一书.令我困惑的是对象的"引用"和对象的"指针"之间的区别.我知道引用必须在声明时初始化,而指针可以留待以后初始化.但我想知道它们之间的物理实现差异.
为什么要有"参考"机制; 它不是重叠指针的功能?在什么情况下我们应该使用指针以外的参考?非常感谢.
可以将引用视为隐式取消引用的常量指针(请注意这一点).一旦参考,总是一个参考.它允许轻松编写代码.当然,除非您引入移动语义和r值引用.该标准没有强制要求如何实现引用,因为它没有强制如何实现指针.大多数情况下,指针与对象的地址同义.
大多数引用是使用指针变量实现的,即引用通常占用一个字的内存.但是,优化器可以 - 通常是 - 消除纯粹本地使用的引用.例如:
struct S { int a, int b[100]; };
void do_something(const vector<S>& v)
{
for (int i=0; i<v.size(); ++i) {
int*& p = v[i].b;
for (int j=0; j<100; ++j) cout <<p[j];
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,p不需要存储在存储器中(可能它只存在于寄存器中,也许它会消失在指令中).
尽可能使用引用,并在需要时使用指针.您需要使用指针的原因:
std::vector
通常更好).但是,有两种情况下根本没有真正重叠的情况,你根本无法用另一种代替.举一个明显的例子,请考虑以下代码:
template <class T, size_t N>
size_t size(T(&matrix)[N]) {
return N;
}
Run Code Online (Sandbox Code Playgroud)
这允许您查找数组的大小:
int array1[some_size];
int array2[some_other_size];
size_t n = size(array1); // retrieves `some_size`
size_t m = size(array2); // retrieves `some_other_size`
Run Code Online (Sandbox Code Playgroud)
...但是如果你试图传递一个指针,它就不会编译:
int *x = new int[some_size];
size_t n = size(x); // won't compile
Run Code Online (Sandbox Code Playgroud)
在最好的情况下,当它的一部分要拒绝传递指针时,编写接收指针的代码似乎没有多大意义.