从C到Cpp——七、this指针

文章介绍了C++中const成员函数的声明和使用,以及this指针的概念和作用。在const成员函数中,函数不能修改对象的状态。this指针是一个隐含的参数,指向调用成员函数的对象,可用于访问和修改成员变量。文中通过Vehicle类的示例展示了如何在构造函数中使用this指针,并且演示了如何通过->运算符调用指向对象的指针的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、const成员函数

定义成员函数时通过如下声明来确保类方法不会修改所访问的数据:

在写函数声明的时候,后面加上const修饰符;在定义函数本体时,后面加上const修饰符。

void function(int num) const;
void function(int num) const
{
    statement;
}

二、this指针

所有的类成员函数都包括一个隐含参数,this指针,这是一个指向这个类型的指针;虽然在函数声明和函数定义中并没有显示这个参数,但这个参数是的的确确存在的,编写函数的时候可以直接调用!

this指针会指向对象自身,所以如果这个对象有一个int型成员变量a,可以通过如下方式访问变量a

this->a

所以看下面这一段程序

#include <iostream>
#include <string>
using namespace std;
class Vehicle
{
	private:
		string name;
		string color;
		int price;
		int type;
	public:
		Vehicle();
		Vehicle(string p_name,string p_color,int p_price,int p_type);
		
};

Vehicle::Vehicle():name("no name"),color("no color"),price(0),type(0)
{
	
}

Vehicle::Vehicle(string p_name,string p_color,int p_price,int p_type)
{
	name=p_name;
	color=p_color;
	price=p_price;
	type=p_type; 
}

int main(void)
{
	Vehicle car1("BMW M3","Blue",850000,1);
}

在构造函数Vehicle中,name=p_name等价于this->name=p_name,依次类推,所以Vehicle可以如下定义:

Vehicle::Vehicle(string p_name,string p_color,int p_price,int p_type)
{
	this->name=p_name;
	this->color=p_color;
	this->price=p_price;
	this->type=p_type; 
}

事实上,name在函数定义中是this->name的缩写,类方法是依靠this指针访问成员对象的!

三、类似结构体的->

注意到,this指针后使用了->运算符,因为this->name可以被理解为(*this).name,这和结构体中的定义是一模一样的!

不光this指针,任何类型为指向某种类型的指针都可以使用该运算符号,下面是示例:

#include <iostream>
#include <string>
using namespace std;
class Vehicle
{
	private:
		string name;
		string color;
		int price;
		int type;
	public:
		Vehicle();
		Vehicle(string p_name,string p_color,int p_price,int p_type);
		void changeprice(int newprice)
		{
			price=newprice;
		}
};


Vehicle::Vehicle(string p_name,string p_color,int p_price,int p_type)
{
	this->name=p_name;
	this->color=p_color;
	this->price=p_price;
	this->type=p_type; 
}

int main(void)
{
	Vehicle* car2=new Vehicle("BMW M4","Yellow",1200000,2);
	car2->changeprice(1000000);
}

car2->changeprice(1000000);

这一语句即是->运算符号的实例,说明 指向对象的指针->成员函数 的方式是可以被使用的。

注意,对于定义在堆上的对象,如果对象的构造函数需要带参数,则在new运算符后加上参数:

Vehicle* car2=new Vehicle("BMW M4","Yellow",1200000,2);

 很有意思!

### C++ 中 `this` 指针的概念 在 C++ 编程语言中,`this` 是一个特殊的指针变量,在类的非静态成员函数内部自动存在。它指向当前正在被操作的对象实例[^1]。通过使用 `this` 指针,可以访问对象的数据成员以及成员函数。 #### 为什么需要 `this` 指针? 当在一个类的方法中定义了一个局部变量或者参数名与数据成员同名时,可能会发生命名冲突。此时可以通过 `this->` 来区分它们,其中 `this` 明确表示的是当前对象的数据成员[^2]。 --- ### `this` 指针的主要用途 以下是几种常见的场景下 `this` 的应用方式: #### 1. 解决名称冲突 如果某个方法接收的参数名字与其所属类中的成员变量相同,则可以用 `this` 指向实际的成员变量来消除歧义。 ```cpp #include <iostream> using namespace std; class Person { private: string name; public: void setName(string name) { this->name = name; // 使用 this 区分成员变量和形参 } void getName() const { cout << "Name is: " << name << endl; } }; int main(){ Person p; p.setName("Alice"); p.getName(); return 0; } ``` 上述例子展示了如何利用 `this` 避免因重名而产生的混乱情况。 #### 2. 返回当前对象本身 返回 *current object* 可用于链式调用(chaining),即连续执行多个操作于同一个对象之上而不需重复指定目标实体。 ```cpp class Counter{ private: int count; public: Counter():count(0){} Counter& increment(){ ++count; return *this; // 返回自身的引用以便支持连贯调用 } void displayCount()const{ cout<<"Current Count:"<<count<<endl; } }; // 测试部分省略... ``` 这里展示了一种模式——允许像这样写代码:`counter.increment().increment()`[^3]。 #### 3. 调用其他成员函数 有时候可能希望从某成员函数内部去触发另一个成员函数的动作;这时就可以借助 `this` 实现这一点。 ```cpp void bar() { std::cout << "Inside bar()" << std::endl; this->foo(); // 利用 this 呼叫另一项功能 } ``` 此片段取自先前提供的资料说明了怎样借由 `this` 执行额外的功能呼叫。 #### 4. 动态分配内存给对象副本 另外一种常见情形是在构造器里复制传入的对象属性值到新建立出来的个体之中,这时候也可以运用 `this`. ```cpp Person(const Person &other){ *(this)= other;// 将 another 对象的内容赋值给自己 } ``` 注意这里的语法结构意味着把右侧表达式的全部字段逐一对应拷贝至左侧所代表的新建体当中[^4]。 --- ### 总结注意事项 尽管 `this` 提供了许多便利之处,但也有一些地方值得特别留意: - 它仅存在于非静态成员函数之内; - 不可手动修改其地址值; - 当涉及多线程环境下的共享资源管理时要格外小心同步问题等等。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值