this指针~类的静态成员~类的const成员~内联函数

本文详细介绍了C++中的this指针,包括其类型、作用域和特点,并指出它不能在静态成员函数中使用。接着讲解了类的静态成员的特性和使用限制,以及静态成员函数与非静态成员函数的交互。此外,文章还探讨了const修饰成员的规则以及const对象和成员函数的调用限制。最后,讨论了内联函数的概念和作用,以及何时不应使用内联函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是this指针?

  • this 是 c++中的一个关键字,也是一个常量指针,指向当前对象(所谓的当前对象,就是正在使用的对象),也就是当前对象的首地址。通过this指针,可以访问当前对象的成员变量和成员函数。
  • this指针的类型    类类型 * const
  • this指针并不是对象本身的一部分,不会影响sizeof的结果
  •  this的作用域在类成员函数的内部
  • this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递
  • 只有在类的非静态成员函数中才可以使用this指针

 注意: 

  • this 是常量指针,它的值不能被修改
  • this 只能在成员函数内部使用
  • 只有对象被创建后this才有意义,因此不能再static成员函数中使用

this 它是成员函数和成员变量之间的桥梁

     _thiscall调用约定

  • _thiscall只能用在类的成员函数上
  • 参数从右向左压栈
  • 如果参数个数确定,this指针通过ecx传递给调用者,如果参数不确定,this指针在所有的参数压栈后压入堆栈

this指针是否可以为空?

1 )  NULL对象指针可以调用成员函数
2)通过对象调用成员函数,对象的指针会被传入函数中,指针名称为this
3)NULL对象指针调用成员函数时,只要不访问此对象的成员变量,则程序正常运行
4)NULL对象指针调用成员函数时,一旦访问此对象的成员变量,则程序崩溃

类的静态成员

声明为static的类成员,称为类的静态成员
特性:

  • 类的静态成员为所有类对象所共有,不属于某个具体的实列
  • 类的静态成员,即可用类名::静态成员或者对象.静态成员名来访问
  • 类的静态成员变量必须在类外定义,定义时不需要添加stdtic关键字
  • 类的静态成员函数没有默认的this指针,所以在静态成员函数里面不能使用任何非静态成员
  • 也有访问限定符,也具有返回值,const修饰符等

注意 1,静态成员函数可以调用非静态成员函数吗?

        类的静态成员函数的函数形参中没有默认的this指针,导致不能调用具体实例对象的成员。
        如果有需求:可以采用如下几个方法?
        a>类中实例化对象,在创建的时候把this指针赋值给那个静态成员
        b>类外实例化对象,全局对象
        c>类外实例化对象,传参数(看自己需要使用值、地址、引用)

 const修饰类成员

      在C语言中const修饰的变量具有常属性,但仍然为一个变量
      在c++中const定义的变量是一个常量

      使用场景 :

  • 修饰形参,一般和引用同时使用
  • 修饰返回值
  • 修饰类数据成员,必须在构造函数的初始化列表中初始化
  • 修饰类成员函数,实际修饰隐含的this,表示在类中不可以对类的任何成员进行修改
  • const修饰的成员函数中要对类的某个数据成员进行修改,需要在需要修改的数据成员前加上mutable

注意 1,const对象可以调用非const成员函数和const成员函数吗? 

     const对象不可以调用非const成员函数,可以调用const成员函数(const对象定义的函数体里面不能对当前对象进行修改)

       2,非const对象可以调用非const成员函数和const成员函数吗?      

     非const对象可以非const成员函数,也可以调用const成员函数。

      3,const成员函数可以调用其他const成员函数和非const成员函数吗?      

      const成员函数内可以调用const成员函数,但是不能调用非const成员函数(普通成员函数)

      4,非const成员函数可以调用其他const成员函数和非const成员函数吗?     

       非const成员函数内可以调用const成员函数,也可以调用非const成员函数
注意 :构造函数不能用const修饰?

const修饰类的成员函数,实际上就是在修饰当前对象,构造函数没有调用,则当前对象不存在,也就不能修饰构造函数的指针,只知道一块空间的位置,初始化列表没有执行。没有初始化,不知道当前对象具体占了几个字节。a、构造函数没有执行,当前对象不存在;b、构造函数里面,创建成功之后需要放一些初始值,用const对象修饰以后不能给对象放初始值。

   内联函数 

    以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数 的地方展开(替换掉,内联函数替换发生在编译器编译的阶段而宏替换发生在预处理阶段),没有函数压栈的开销,内联函数提升程序运行的效率

  •    inline是一种以空间换时间的做法,省去调用函数额开销。所以代码 很长或者有循环/递归的的函数不适宜使用内联,可以   提高运行效率。
  •    inline对于编译器而言只是一个建议,编译器会自动优化,如果定义 为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联
  •    inline必须函数定义放在一起,才能成为内联函数,仅将inline放在 声明前是不起作用的
  •   定义在类内的成员函数默认定义为内联函数

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值