C++中不使用this指针,构造函数内访问同名类成员变量的方法与原理
关于C++构造函数中不使用this指针访问成员变量的问题
嘿,这个问题问得挺到位的,咱们一步步拆解清楚~
1. 不使用this指针访问并赋值类成员变量的方法
其实分两种情况来看:
- 参数和成员变量不同名时:直接用成员变量名就行!因为构造函数是类的成员函数,天生就有权限访问类的成员,只要命名不冲突,编译器能直接识别出你要操作的是类成员:
class abc { int x; public: abc(int val) { x = val; // 直接访问成员变量x,毫无问题 } };
- 参数和成员变量同名时:除了你用的
类名::成员变量名,还有个常用方法是用成员初始化列表,也不用写this:
class abc { int x; public: abc(int x) : x(x) {} // 初始化列表里左边是成员x,右边是参数x,编译器能正确区分 void prnt() { cout << x; } };
2. 为什么abc::x = x这种写法可行?
核心原因是C++的作用域规则和成员函数的隐含对象绑定:
- 当参数(局部变量)和类成员同名时,局部变量会「隐藏」成员变量——直接写
x的话,编译器会优先认为你指的是参数x,而不是类里的成员x。 - 在类的非静态成员函数(比如构造函数)里,用
类名::成员变量名这种写法,编译器会自动把它和当前正在调用函数的对象(也就是你正在构造的那个abc对象)绑定起来,效果其实和this->x一样,但你没显式写this指针。 - 回到你的代码里,
abc::x = x就是明确告诉编译器:“我要赋值的是abc类的成员变量x(当前对象的那个x),不是手里的参数x”,所以这个赋值完全符合C++标准,能正确给成员变量赋值。
小提醒:虽然这种写法合法,但实际开发里更推荐用命名区分(比如给成员变量加个m_前缀,写成m_x),或者直接用this->x,这样代码可读性更高,不容易搞混~
内容的提问来源于stack exchange,提问作者dumb person
相关产品推荐
相关产品推荐

