《随笔3》——C++中的“隐藏的this指针、Stataic数据成员、Stataic静态成员函数”

本文详细介绍了C++中的this指针,强调了其在成员函数中的作用,以及不能在静态成员函数中使用的特性。同时,讨论了静态数据成员的特性,如它们是所有对象共享的,不能在类内初始化,但可以在类外定义并初始化。此外,还提到了静态成员函数的使用限制,即不能访问非静态成员,但可以访问静态成员。
摘要由CSDN通过智能技术生成

目录

隐藏的this指针

静态数据成员

const 静态成员数据的初始化

静态成员能用于某些场景,而普通成员不能

static 成员函数


隐藏的this指针


●  对于类的非静态成员,每一个对象都有自己的一份拷贝, 即每个对象都有自己的数据成员, 不过成员函数却是每个对象共享的。 那么调用共享的成员函数是如何区分自己的的数据成员呢,答案就是通过类中隐藏的this 指针。

●  this 指针是隐含在每个类成员函数中的指针, 其指向正在操作此函数的类对象,其类型为当前类类型的指针类型,在const函数中, 为当前类类型的const指针类型。 this指针的作用域是在类内部, 当在类的非静态成员函数中访问类的非静态成员时, 编译器会自动将对象本身的地址作为一个隐含参数传递给函数。

●  注意: 类的静态成员函数中没有this指针



void func(void *p, int val);
class A
{
public:
	int getA()
	{
		return a;
	}
	void setA(int val);
	friend void func(void *p, int val);
private:
	int a;
};
void func(void *p, int val)
{
	A *pp = (A*)p;  得到对象指针
	pp->a = val;
}
void A::setA(int val)
{
	func(this, val); 调用全局函数,this 表示当前对象指针
}
int main()
{
	A aa;
	aa.setA(500);
	int x = aa.getA();
	cout << "输出x的值:" << x << endl;
	system("pause");
	return 0;
}

在调用函数func时第一个参数是this 指针, 表明将对象aa 的指针传入 func中,然后通过对象aa 改变其中的成员变量a的值。

通过对象aa 调用setA() 函数, 在该函数的内部,this指针持有aa 对象的地址。 以这样的方式, 成员函数可以访问对象内的任何元素。

this指针将作为隐藏的参数传递给每个成员函数, 且this指针通常是函数接受的第一个参数、其后是已声明的其他参数, 假定setA() 函数如下:

void setA(A *this,int val);

在调用该函数时,应该这样:

aa.setA(&aa,500);

● 成员函数通过一个名为this的额外隐式参数来访问调用它的那个对象。 当我们调用一个成员函数时,用请求该函数的对象地址初始化this。 例如, 如果调用

aa.getA()

则编译器负责把 aa 传递给了 getA()函数的隐式形参this.

● 隐藏的this 指针应该注意的问题

this指针不能被修改,因为它是个常量指针。绝不能给它赋值,需要在成员函数内部修改this指针的情况很少见

返回 *this 指针表示把该指针指向的对象当作一个整体返回, 而非访问该对象中的某个成员。

什么时候必须使用this指针

利用this指针去除歧义的时候。

当我们希望返回对调用某函数的对象的引用时, 必须使用*this。

另一种情况是: 我们希望获得对象的地址,也必须显式使用this 指针。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值