为何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
相关产品推荐
相关产品推荐

