成员变量前请加上this

    以前写代码总是觉得在 成员变量前请加上this或者在成员函数前加上this太麻烦。但是当我们在类中声明了一个函数,可能是实例的成员函数,
可能是类的方法。接着进行定义这个方法时,通常都是通过拷贝过去,很少有人会在定义的时候重新把这个方法敲一遍。
问题常常处在我们想偷懒的地方,拷贝过去后,通常会忘记在这个方法前添加这个类的名字,这个函数里面如果有用到成员属性,
那么在链接时出错提示,找不到某某变量,对有经验的人来说,或者常常写程序的人来说,这种提示也算比较明了了。但是如果在
使用所有成员属性,成员方法时都加上this指针,这个时候的提示是:找不到成员函数或者方法,很显然这种提示更明了。
这是一方面,另方面,当一个函数模块中定义了很多 局部变量时候,让读者或者自身分辨成员变量就有些麻烦了,当然在成员变量前加上
_m是一个好习惯,如果能再加上this我想会更清晰。
### C++ 成员变量与 `this` 指针 在面向对象编程中,的成员函数可以访问该的对象的数据成员和其他成员函数。为了区分全局变量或其他局部变量,C++ 提供了一个特殊的指针——`this` 指针。每当调用一个对象的方法时,编译器会隐式地将对象地址作为参数传递给方法中的 `this` 指针。 #### 使用 `this` 指针解决命名冲突 当数据成员的名字和局部变量名字相同时,可以通过 `this` 来明确指定要操作的是当对象的数据成员而非局部变量: ```cpp class MyClass { public: int value; void setValue(int value) { this->value = value; } }; ``` 上述代码展示了如何利用 `this` 指向当实例并将其属性设置为传入的新值[^1]。 #### 利用 `const` 关键字保护不可变状态 如果希望某些成员函数不会改变对象的状态,则可以在声明这些函数时加上 `const` 后缀,并且在实现过程中确保不修改任何非静态数据成员或调用其他可能更改对象状态的非常量成员函数。此时,在这样的成员函数内部使用的 `this` 将是指向常量型的指针 (`const T*`)。 ```cpp class ImmutableClass { private: double piValue; public: // 构造函数初始化列表形式 explicit ImmutableClass(double val): piValue(val){} // 声明为 const 的成员函数 double getPi() const { return this->piValue; // 这里 'this' 是 const 型 } // 非 const 成员函数尝试修改数据成员将会报错 void setPi(double newVal){ this->piValue = newVal; } }; ``` 这段程序说明了怎样定义只读接口以及它们之间对于 `this` 不同处理方式的区别[^2]。 #### 复制构造函数与深拷贝浅拷贝概念 另一个常见的应用场景是在自定义复制构造函数内使用 `this` 指针来执行深层副本创建工作,从而避免两个不同对象共享同一份资源带来的潜在风险。例如管理动态分配内存的情况就需要特别注意这一点。 ```cpp #include <iostream> using namespace std; class DeepCopyExample { private: char *data; public: DeepCopyExample(const char *str); ~DeepCopyExample(); // 显式的复制构造函数 DeepCopyExample(const DeepCopyExample &source); friend ostream& operator<<(ostream&, const DeepCopyExample&); }; // 定义外部友元运算符重载 << 输出对象的内容 ostream& operator<<(ostream &out, const DeepCopyExample &obj) { out << obj.data; return out; } DeepCopyExample::DeepCopyExample(const char *s) : data(NULL) { if(s != NULL && strlen(s)) { data = new char[strlen(s)+1]; strcpy(data,s); } } DeepCopyExample::~DeepCopyExample(){ delete [] data; } // 实现显式的复制构造函数来进行深层次复制而不是简单的位级复制 DeepCopyExample::DeepCopyExample(const DeepCopyExample &source) : data(new char[strlen(source.data)+1]) { strcpy(this->data, source.data); } ``` 此部分解释了为什么有时候需要手动编写复制构造函数以防止意外行为的发生,并给出了具体例子展示如何正确运用 `this` 指针完成这项任务[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值