1、this指针与静态成员
1、this指针的由来
C++可以说是C的升级版,甚至在一开始C++可以用C的编译器来编译。那么C++如何翻译成C程序,然后再用C的编译器来编译呢?这里面有一个很重要的概念,就是this指针。
2、关于this指针的例子(通过C程序理解this指针)
//下面是一段C++程序
class CCar {
public:
int price;
void SetPrice(int p);
};
void CCar::SetPrice(int p)
{ price = p; }
int main()
{
CCar car;
car.SetPrice(20000);
return 0;
}
//那么这段C++程序如何翻译成C程序呢?
struct CCar {
int price;
};
void SetPrice(struct CCar * this int p)
{ this->price = p; }
int main() {
struct CCar car;
SetPrice( & car,20000);
return 0;
}
也就是说,把一个C++类翻译成一个C程序遵循的规则:
(1)类的成员变量便以为C程序的一个结构,名字就是C++的类的名字。
(2) 类的成员函数翻译成C程序的全局函数,但是相比于原本的成员函数,这个全局函数要多出一个参数,而这个参数便是指向类对应的结构的类型的指针。也就是说this实际上就是一个结构指针。
(3)在创建一个C++类的时候,对应的C程序就是创建一个C的对应类的结构。
(4)而调用C++的成员函数,则是调用对应的全局函数,而多出的参数便是指向刚才创建的这个类的指针,这个指针起名为this
(5)于是这样一来,调用这个全局函数,变作用在了this指向的结构变量上面。
3、撇开通过C理解C++,单独看C++中this指针的作用
- this指针的作用就是指向成员函数所作用的对象。
- 非静态成员函数中可以直接使用this来代表指向该函数
作用的对象的指针(即翻译成c程序时,指向结构变量的指针)。
class A
{
int i;
public:
void Hello_1() { cout << "hello" << endl; }
void Hello_2() { cout << i<<"hello" << endl; }
};
int main()
{
A * p = NULL;
p->Hello_1();//等价于 void Hello_1(A * this); 即使this指向空也不会报错。
p->Hello_2();//等价于等价于 void Hello_1(A * this);,此时需要用到结构中的数据,但是this没有指向结构,因此会报错。
}
4、静态成员与this指针
C++中一个类内部定义的成员函数和成员变量可以加static关键字,这样的成员分别被称为静态成员函数、静态成员变量,合起来就叫静态成员。
C++的静态成员函数翻译成C程序就是一个普通的全局函数,而且并没有多出来一个指向this结构的指针。因此静态成员函数实际上就是一个C程序中的普通全局函数。但是由于这个全局函数与这个类的联系非常紧密,因此将其定义到了该类中。
C++的静态成员变量翻译成C程序就是一个全局变量,出于同样的原因(这个全局变量与这个类的联系非常紧密)将其定义到了该类中。
5、静态成员变量的特点
- 普通成员变量每个对象有各自的一份,而静态成员变量一共就一份, 为所有对象共享。
- 普通成员函数必须具体作用于某个对象,而静态成员函数并不具体作用于某个对象。
- 由于上述,静态成员不需要通过对象就能访问。
- 静态成员变量本质上是全局变量,哪怕一个对象都不存在,类的静态成员变量也存在。
6、静态成员函数的特点
在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数。(它的本质是全局函数,全局函数不可以直接访问访问类的成员。)