You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C++中返回指针引用与指针的两个函数返回值相同?b为nullptr时无异常?

struct a { 
public: 
    int* b; 
    int *& fun1() { return b; } 
    int * fun2() { return b; } 
}; 
void main() { 
    a* some = new a; 
    some->b = new int(1); 
    int* x1 = some->fun1(); 
    int* x2 = some->fun2(); 
    return; 
}

问题1:为何返回int*&类型的fun1与返回int*类型的fun2返回值相同?

这俩函数的返回机制本质不同,但最终赋值给x1和x2后结果一致,核心原因是:

  • fun1()返回的是成员变量b的引用(也就是int*类型的引用),但当你把这个引用赋值给int* x1时,C++会自动将引用指向的对象(也就是b存储的指针地址)拷贝一份给x1。
  • fun2()返回的是b的值拷贝,直接把b里存的指针地址复制一份返回,再赋值给x2。

所以不管是通过引用间接拷贝,还是直接值拷贝,x1和x2最终拿到的都是b当时存储的指针地址,看起来返回结果就一样了。不过要注意它们的语义区别:如果用fun1()的返回值做赋值(比如some->fun1() = new int(2);),会直接修改some->b本身;但fun2()的返回值是临时副本,赋值给它不会影响原有的some->b。

问题2:为何当some->b为nullptr时,两个函数均返回null且不抛出异常?

因为nullptr是C++里完全合法的指针值!返回空指针本身并不会触发异常——只有当你解引用这个空指针(比如*x1或者*some->b)时,才会导致未定义行为(可能崩溃,但不一定抛出标准异常)。

这两个函数只是把b里存储的值(不管是有效内存地址还是nullptr)返回出去,这个过程本身是安全的,C++没有任何规则要求返回空指针必须抛出异常,所以自然不会有异常产生。

内容的提问来源于stack exchange,提问作者upiorek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:49:35