c++中的this

一、c++中为何要有this

1、先来看一个例子

#include "stdafx.h"
#include <iostream>
using namespace std;
class Student{
private:
	char *m_name;
	int m_age;
	float m_score;
public:
	void setage(int m_age);
	//声明构造函数
	Student(char *name, int age, float score);
	//声明普通成员函数
	void show();
};
//定义构造函数
Student::Student(char *name, int age, float score){
	m_name = name;
	m_age = age;
	m_score = score;
}
void Student::setage(int m_age){
	m_age = m_age;
}
//定义普通成员函数
void Student::show(){
	cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
}
int main(){
	//创建对象时向构造函数传参
	Student stu("李雷", 5, 92.5f);
	stu.setage(10);
	stu.show();
	//创建对象时向构造函数传参
	Student *pstu = new Student("韩梅梅", 15, 96);
	pstu->setage(20);
	pstu -> show();
	return 0;
}
  • 输出结果是李雷的年龄是5,成绩是92.5;韩梅梅的年龄是15,成绩是96。可能有些读者感到疑惑,年龄为什么不是10,20呢?
  • 真正的原因是c++变量的作用域问题,函数形参跟你的变量重名,在函数内部,c++会仍然使用函数形参,也就是现在真正的类变量m_age是没有调用到的!

那怎么样才能调用到类变量呢?
2、再看另一个例子

#include <iostream>
using namespace std;
class Student{
private:
	char *m_name;
	int m_age;
	float m_score;
public:
	void setage(int m_age);
	//声明构造函数
	Student(char *name, int age, float score);
	//声明普通成员函数
	void show();
};
//定义构造函数
Student::Student(char *name, int age, float score){
	m_name = name;
	m_age = age;
	m_score = score;
}
void Student::setage(int m_age){
	this->m_age = m_age;
}
//定义普通成员函数
void Student::show(){
	cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
	//cout<<this->m_name<<"的年龄是"<<this->m_age<<",成绩是"<<this->m_score<<endl;
}
int main(){
	//创建对象时向构造函数传参
	Student stu("李雷", 5, 92.5f);
	stu.setage(10);
	stu.show();
	//创建对象时向构造函数传参
	Student *pstu = new Student("韩梅梅", 15, 96);
	pstu->setage(20);
	pstu -> show();
	return 0;
}
  • 输出结果是李雷的年龄是10,成绩是92.5;韩梅梅的年龄是20,成绩是96
  • 原来这样,笔者会不会有这样的疑问,我们的类Student ,比如创建了stu,pstu,两个对象均调用函数show,那么我们的类是如何知道,我们是哪个对象调用了这个show函数呢?
  • 原来c++在这块,把一个东西隐藏了,对就是所属对象的地址也就是我们的this指针

二、this定义说明

1.定义

  • this 是 C++ 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。

  • 所谓当前对象,是指正在使用的对象。例如对于stu.show();,stu 就是当前对象,this 就指向 stu。

2.说明

  • this 只能用在类的内部,通过 this 可以访问类的所有成员,包括 private、protected、public 属性的。
  • 注意,this 是一个指针,要用->来访问成员变量或成员函数。

3.总结

  • this 是 const 指针,它的值是不能被修改的,一切企图修改该指针的操作,如赋值、递增、递减等都是不允许的。
  • this 只能在成员函数内部使用,用在其他地方没有意义,也是非法的。
  • 只有当对象被创建后 this 才有意义,因此不能在 static 成员函数中使用(后续会讲到 static 成员)

三、this总结

  • 只能在“成员函数”中使用
  • this指针类型: 类类型 *const (加const是为了保证,指针的指向不被更改)
  • this指针不存储在对象中,不影响对象大小,且始终指向当前对象
  • this指针是“成员函数”的第一个隐藏参数,由编译器自动给出
### C++ 中 `this` 关键字的用法 在 C++ 中,`this` 是一个指向当前对象的指针。它主要用于类成员函数内部,表示调用该成员函数的对象本身。以下是关于 `this` 的一些重要特性和用途: #### 1. 避免变量名冲突 当局部变量与成员变量同名时,可以使用 `this->` 来区分它们。 ```cpp class MyClass { private: int value; public: void setValue(int value) { this->value = value; // 使用 this 指向成员变量 } int getValue() const { return value; } }; ``` 在此例子中,`setValue` 方法中的参数名为 `value`,而类的私有成员也叫 `value`。通过 `this->value` 明确指定要操作的是类的成员变量[^1]。 --- #### 2. 返回当前对象以支持链式调用 返回 `*this` 可以实现方法链式调用的功能。 ```cpp class ChainableClass { private: int data; public: ChainableClass& setData(int d) { data = d; return *this; // 返回当前对象的引用 } ChainableClass& incrementData() { ++data; return *this; } void display() const { std::cout << "Data: " << data << '\n'; } }; int main() { ChainableClass obj; obj.setData(5).incrementData().display(); // 链式调用 } ``` 在这个例子中,`setData` 和 `incrementData` 均返回 `*this`,从而允许连续调用多个方法。 --- #### 3. 在构造函数初始化列表中传递当前对象地址 可以通过 `this` 将当前对象的地址传给其他对象或函数。 ```cpp class A { public: void process(A* a); }; class B { private: A memberA; public: B() : memberA(this) {} // 将当前对象的地址传递给 memberA }; ``` 这里展示了如何利用 `this` 把当前实例作为参数传递到另一个对象或者函数中。 --- #### 4. 动态分配对象并赋值给自己 如果需要动态创建一个新的对象并将自己替换掉,则可以用 `this` 实现自我复制功能。 ```cpp class SelfCopy { public: SelfCopy(const SelfCopy&) { /* 复制逻辑 */ } void copySelfDynamically() { SelfCopy* newObject = new SelfCopy(*this); // 创建新副本 delete this; // 删除旧对象 *this = *newObject; // 更新现有对象状态 delete newObject; // 清理临时资源 } }; ``` 上述代码片段演示了如何借助 `this` 完成自定义类型的深拷贝过程。 --- #### 注意事项 - **常量成员函数**: 如果某个成员函数被声明为 `const` 类型,在此函数体内访问 `this` 会得到一个指向常量版本的指针(即 `const ClassType* const this`)。这意味着无法修改任何非静态数据成员。 - **静态成员函数**: 静态成员函数不隶属于特定实例,因此其中不存在隐式的 `this` 参数。 --- ### 总结 `this` 是一种强大的工具,用于解决命名歧义、提供流畅接口设计以及管理复杂生命周期等问题。合理运用它可以提高代码可读性和效率。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郑同学的笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值