下周我们为测试准备了练习单,用于学习一点C ++(这里仍然是初学者)。我还是想不出一个简单的问题。
也就是说,为什么这些代码片段有问题?
int& p(int z) { return z; }
int* h(int z) { return &z; }
答案 0 :(得分:6)
调用int *h(int z) {return &z}
时,传递给函数的参数复制到名为z
的变量。该副本只持续功能。因此,一旦函数返回,它就不再可用于您的程序。因此,一旦函数返回,您就无法获得指向它的有效指针:正式&z
无效。
引用版本int &p(int z) {return z}
也是如此。
作为练习,看看如果z
本身就是参考,即表示会发生什么:int &p(int& z) {return z}
。然后,不会拍摄副本。但要注意,没有专业人士会写这样的函数。
答案 1 :(得分:3)
返回值的行为是未定义的。这里很棘手的是,如果你通过某种操作测试你的函数(例如打印到std输出或断言),你可能经常得到预期的结果但是没有意味着它是安全的,因为返回值指向堆栈中写入的值,该值可以在函数返回后的任何给定时刻被消除(称为堆栈展开)。所以,经验法则是,不要将函数的本地定义变量的地址或引用返回,除非它被定义为静态,除非情况迫使你,否则为什么人们会更喜欢这个? : - )
答案 2 :(得分:-7)
两个片段都将引用(或第二种情况下的指针)传递给临时。例如考虑p(18)
。 18实际存储在哪里?那么p(18)
指向哪里?
旁注:如果一切都是常量,代码就可以了,即。
int const & p(int const & input) { return input; }
标准可以保证。