C++赋值运算符与空指针问题:如何实现空指针赋值时置成员为0?
问题分析与解决方案
首先要明确:你的代码里a=*s这一行,当s是空指针时,解引用空指针本身就是未定义行为——程序可能直接崩溃,根本不会进入赋值运算符函数。所以没法通过修改原有的operator=(const XY&)来处理这种场景,因为引用必须绑定到有效的对象,空指针解引用后无法得到合法的引用。
要实现需求,正确的做法是重载一个接受指针参数的赋值运算符,这样可以直接传入指针,避免提前解引用空指针。
修改后的代码示例
class XY { public: int p; XY(int i):p{i} {} // 原有的引用版赋值运算符,处理正常对象赋值 XY& operator=(const XY& cs) { p = cs.p; return *this; } // 新增的指针版赋值运算符,处理指针为空的情况 XY& operator=(const XY* cs_ptr) { if (cs_ptr == nullptr) { p = 0; } else { // 复用引用版的赋值逻辑,避免重复代码 *this = *cs_ptr; } return *this; } }; int main () { XY a=3; XY *s=nullptr; a = s; // 直接传指针,无需解引用 }
关键说明
- 新增的
operator=(const XY*)允许直接传入指针,这样就能在函数内部安全检查指针是否为空。 - 如果指针非空,就复用原有的引用版赋值运算符,保证代码复用性。
- 原有的
a=*s写法必须改成a=s,否则还是会触发解引用空指针的未定义行为。
内容的提问来源于stack exchange,提问作者Stefan Deller
相关产品推荐
相关产品推荐

