C ++有问题的代码片段

时间:2015-09-24 11:27:22

标签: c++

下周我们为测试准备了练习单,用于学习一点C ++(这里仍然是初学者)。我还是想不出一个简单的问题。

也就是说,为什么这些代码片段有问题?

 int& p(int z) { return  z; }
 int* h(int z) { return &z; }

3 个答案:

答案 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; }

标准可以保证。