您的位置:首页 > 编程语言 > C语言/C++

this指针和 C++中static用法解析

2019-08-13 21:45 1266 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_43867762/article/details/99449864

this 指针是成员函数里面的一个隐藏指针,指向了调用该函数的对象本身。

this指针特性:

  1. this指针的类型为:类类型* const
  2. this指针并不是对象本身的一部分,不影响sizeof结果
  3. this指针的作用域在类“非静态成员函数”内部
  4. this指针是”非静态类成员函数”的第一个默认隐含参数,编译器自动维护传递,类编写者不能显式传递
  5. 只有在类的非静态成员函数中才可以使用this指针,其它任何函数都不可以
  6. this指针不能在初始化列表中使用
  7. 通过this指针访问数据成员时,this指针不能为空

C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。
一.面向过程设计中的static
静态全局变量
在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。
静态全局变量有以下特点:

  1. 该变量在全局数据区分配内存
  2. 未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化)
  3. 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的

一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。

定义静态全局变量还有以下好处:

  1. 静态全局变量不能被其它文件所用。
  2. 其它文件中可以定义相同名字的变量,不会发生冲突。

静态局部变量
静态局部变量有以下特点:
3. 该变量在全局数据区分配内存。
4. 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化。
5. 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0。
6. 它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域也结束。
静态函数
  在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。
定义静态函数的好处:

  1. 静态函数不能被其它文件所用;
  2. 其它文件中可以定义相同名字的函数,不会发生冲突;

二、面向对象的static关键字

静态数据成员有以下特点:

  1. 静态数据成员要在类外定义,此时不能再带上static的关键字。
  2. 静态数据成员和普通数据成员一样遵从public,protected,private访问规则;
  3. private,protected 的static成员虽然可以在类外初始化,但是不能在类外被访问。
    .4.静态成员为所有类对象所共享
    类的静态数据成员有两种访问形式:
    <类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>
    如果静态数据成员的访问权限为public时,可在程序中按上述格式来引用静态数据成员

静态成员函数
关于静态成员函数,可以总结为以下几点:
6. 出现在类体外的函数定义不能指定关键字static;
7. 静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
8. 非静态成员函数可以任意地访问静态成员函数和静态数据成员;
静态成员函数不能访问非静态成员函数和非静态数据成员;
由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
9. 调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:
<类名>::<静态成员函数名>(参数)调用类的静态成员函数。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: