C++三个重要关键字

1. static关键字

信息来源1 信息来源2

  • 静态变量
    • 用法: 在变量前加上 static 关键字,变量就变成了一个静态变量

    • 存储位置: 静态存储区,在程序的整个运行期间都存在

    • 初始化: 未经初始化的全部静态变量都会被初始化为0((对于自由变量初始化的值是任意的,除非是显式的初始化)

    • 作用域: static 不会改变变量的作用域

      全局静态变量:作用域仍为全局作用域,全局静态变量在声明他的文件之外不可见,也就是说是在定义之处起,到文件结尾

      局部静态变量:作用域仍为局部作用域,当定义它的函数快结束的时候,作用域结束。在作用域外我们无妨访问该变量,但是其并不会被销毁,直至我们再次调用该函数,该变量值不变。

  • 静态成员
    • 在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。对多个对象来说,静态数据成员只存储一处,供所有对象共用
  • 静态成员函数
    • 静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员函数的引用不需要用对象名

      静态成员函数在类初始化的时候就会加载到内存中,即使实例化多个对象,在栈中的静态成员函数也是只有一个,所有对象共享这一个静态成员函数,所以说这个函数是属于类的一个函数而不是属于对象的函数。

      静态成员函数中不存在this指针,所以其不能实例化

    • 在静态成员函数中不可以直接引用类中声明的 非静态成员,可以引用类中声明的 静态成员。如果静态成员函数要引用静态成员,可以通过对象来引用。

  • 静态函数
    • 在函数的返回类型前加上关键字 static,函数就会被定义成静态函数;

    • 函数的定义和声明在默认情况下都是 extern 的,但静态函数只在声明他的文件中可见,不能被其他文件使用,因此也不会和其他文件中的同名函数起冲突。

      warning: 不要在头文件中声明static全局函数,也不要在cpp文件中声明非static全局函数

2. const关键字

信息来源

  • 普通成员变量
    • 在一个普通变量类型前加 const 关键字,该变量就会被定义成一个常量,对一个常量赋值是不被允许的行为,所以常量的值是不能改变的。
  • 指针

    const 修饰指针有三种情况:

    • 常量指针: const 修饰指针指向的内容,则内容为常量,不可改变,但指针的指向可以改变

      int a = 21, b = 25;
      const int *p = &a;
      *p = 32; //错误
      p = &b; //正确
      
    • 指针常量: const 修饰指针,则指针为不可变量,不可更改其的指向

      int a = 21, b = 25;
      int* const p = &a;
      *p = 32; //正确
      p = &b;  //错误
      
    • 常量指针常量: const 修饰指针和指针指向的内容,则两者均不可变

      int a = 21, b = 25;
      const int* const p = &a;
      *p = 32; //错误
      p = &b;  //错误
      
    • 背诵口诀 "左定值,右定向,const修饰不变量"

  • 函数参数
    • 当用 const 修饰参数指针时,可以防止指针被恶意篡改

      void Cpf(int *const a)
      {
          cout<<*a<<" ";
          *a = 9;
      }
       
      int main(void)
      {
          int a = 8;
          Cpf(&a);
          cout<<a; // a 为 9
          system("pause");
          return 0;
      }
      
    • 自定义类型的参数传递,需要创建临时对象赋值参数,需要调用拷贝构造函数,比较浪费时间,采用 const 外加引用传递的方式

  • 成员函数
    • const 修饰成员函数表明此函数不会对函数做任何修改。事实上,入股确认成员函数不会对对象成员作任何修改,都应该用 const 修饰,这样无论是 const 对象还是普通对象都可以调用该函数。

    conststatic 不能同时使用,因为静态成员函数中不含有this指针,即不能实例化,而 const成员函数 需要具体到某一实例

3. virtual关键字

  • 多态

    多态主要分为静态多态动态多态。静态多态主要靠重载实现,在编译时就已经确定。动态多态使用虚函数机制实现,在运行时动态绑定。在一个成员函数前添加 virtual 关键词即可将该函数声明为虚函数。

  • virtual 不可与 staticconst 等关键词一起使用。

    • static 函数不属于任何类对象或者实例,因此添加 virtual 也没有意义
    • 虚函数依靠vptrvtable来处理,vptr是一个指针,在类的构造函数中创建生成,并且用智能指针this来访问塔,静态成员没有this指针,所以也无法访问vptr

有关虚函数的介绍请移步:
https://blog.csdn.net/Kimmich6/article/details/119255547

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值