【C++】类与对象 2 : this指针

前言

上篇文章我们初步认识了类与对象 今天这篇文章我们将学习一些新的知识
话不多说 我们直接开始吧

this指针

引入

先来看一段代码

class Date
{
public:
	void Init(int year, int month, int day) {
		_year = year;
		_month = month;
		_day = day;
	}

	void Print() {
		cout << _year << " " << _month << " " << _day << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1, d2;
	d1.Init(2022, 1, 11);
	d2.Init(2022, 1, 12);
	d1.Print();
	d2.Print();
	return 0;
}

在Date类中 的Init和Print函数体中 并没有关于不同对象的区分
那么在d1调用函数的时候 怎么确定操作的是d1还是d2呢

在C++中 引入了this指针来处理这个问题

概念

C++编译器给每个“非静态的成员函数”增加了一个隐藏的指针参数 让该指针指向当前对象(函数运行时调用该函数的对象)
在函数体中 所有“成员变量”的操作 都是通过该指针去访问
只不过所有的操作对用户是透明的 即编译器自动完成

特性

  1. 类型:
    类类型 const* 在成员函数中 不能对this指针赋值
  2. 只能在成员函数的内部使用
  3. this指针本质上是“成员函数”的形参 当对象的地址作为实参传递给this形参 所以对象中不存储this指针
  4. this指针是“成员函数”第一个隐含的指针形参 一般情况由编译器通过ecx寄存器自动传递 不需要用户传递

下面给出一个例子

void Display()
{
	cout << _year << endl;
}

void Display(Date* this)
{
	cout << _year << endl;
}

例题

给出几道小题 方便大家理解
不给答案 大家自己试一下

1.this指针存在哪里

2.this指针可以为空吗

3.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行

class A {
public:
	void Print()
	{
		cout << "Print()" << endl;
	}
private:
	int _a;
};
int main()
{
	A* p = nullptr;
	p->Print();
	return 0;
}

4.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行

class A
{
public:
	void PrintA()
	{
		cout << _a << endl;
	}
private:
	int _a;
};
int main()
{
	A* p = nullptr;
	p->PrintA();
	return 0;
}

结语

这篇文章主要学习了this指针 我们下篇文章见~

希望你有所收获

你可能感兴趣的:(C++知识点,c++,java,jvm)