• 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、静态成员函数的特点
    在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数。(它的本质是全局函数,全局函数不可以直接访问访问类的成员。)

  • 相关阅读:
    Redis(二) 扩展
    Redis(一)基础
    Java垃圾回收机制 入门
    freeregex-0.01 使用文档
    上传文件到阿里云linux服务器
    jQuery代码解释(基本语法)
    JQuery中使用FormData异步提交数据和提交文件
    jQuery获取data-*属性值
    jquery 中 $.map 的使用方法
    mysql创建表时反引号的作用
  • 原文地址:https://www.cnblogs.com/lasnitch/p/12764272.html
Copyright © 2020-2023  润新知