基础回顾少不了,否则看c++的文章容易变成看天书。
但也别紧张,都叫“基础”了那肯定是些简单的偏常识的东西,不难的。
第一个基础是语句和表达式。语句好明白,for(...){}是一个语句,int a = num + 1;也是一个语句,除了一些特殊的语法布局,语句通常以分号末了。表达式是什么呢,语句中除了关键字和符号之外的东西都可以算表达式,比如int a = num + 1中,num、1、num + 1都是表达式。当然单独的表达式也可以构成语句,比如num;是语句。
这里就有个概率要回顾了:“完备的表达式”。什么叫完备,粗暴的明白就是同一个语句里的所有子表达式组合起来的那个表达式才叫“完备的表达式”。举个例子int a = num + 1;中int a = num + 1才是一个完备的表达式;str().trimmed().replace(pattern, gettext());中str().trimmed().replace(pattern, gettext())才是完备的表达式。
这个概念后面会很有效。
第二个要复习的是const T &对临时变量生命周期的影响。
一个临时对象(通常是prvalue)可以绑定到const T &或者右值引用上。绑定后临时对象的生命周期会一直延长到绑定的引用的生命周期结束的时候。但延长有一个例外:
const int &func()
{
return 100;
}
复制代码
这个各人都知道是悬垂引用,但const T &不是能延长100这个临时int对象的生命周期吗,这里理论上不应该是和返回值的生命周期一样么,这么会变成悬垂引用?
答案是语法规定的例外,引用绑定延长的生命周期不能跨越作用域。这里显然100是在函数内的作用域,而返回的引用作用域在函数之外,跨越作用域了,所以这时绑定不能延长临时int对象的生命周期,临时对象在函数调用结束后销毁,所以产生了悬垂引用。
另外绑定带来的延长是不能传递的,只有直接绑定到临时对象上才能延长生命,其他环境比如通过另一个引用举行的绑定都没有效果。
复习到此为止,我们来看详细题目。
函数调用中的生命周期题目