C++学习_静态成员和const详解

C++学习_静态成员和const常量

一。static
  1. C语言中的static
    1). 修饰函数
    被修饰的函数只能在当前文件内使用,即改变了函数的链接属性

    2). 修饰变量

    • 延长了局部变量的生命周期
    • 改变了局部变量的存储位置(栈区->静态数据区(.data))
    • 改变了局部变量的初始值(0xccccccc->0x0000000)
    • 赋予函数内变量拥有“记忆”功能
    • 改变了局部变量的链接属性(只能在本文件内使用)

2.C++中的static
定义:类中的成员如果被static修饰则称为静态成员。
访问方式:
①. 类名::静态成员。
②. 对象名.静态成员。
特性:
- 静态成员独立于类对象而存在,不属于任何具体的实例。也就是说,不管实例化多少个类的对象,类中的静态成员只有一份(eg:可以用来计数)。静态成员变量也不能在初始化列表中初始化,因为初始化列表只能初始化类的成员变量。
- 类的静态成员必须在类外定义,定义时不加static修饰,如果未在类外定义,则无法使用该静态成员!
- 由于类的静态成员独立于类的实例而存在,所以类的静态成员函数不包含this指针,所以类的成员函数内无法使用任何非静态成员。
- 不能将静态成员定义为虚函数
- 除了上面的特性外,类的静态成员和类的普通成员相同,也具有访问属性,也可以被const修饰等。

注:
1。静态成员函数可以调用非静态成员函数吗?
答案:不可以,由于静态成员函数的参数表中没有默认的this指针,所以不可以直接调用类中的非静态成员函数。非静态成员变量和这个的原因相同。
2。上一个问题反过来可以吗?
答案:可以,因为类中的成员都可以调用类中的静态成员。
3。C++中的static成员亦向下兼容C语言中static成员的特性

二。const

注:在C++中,推荐用const常量替换宏常量
好处:const常量不仅具有宏常量的优点,在编译期间就能替换掉具有常属性的变量(const常量),C编译器会将const常量放到内存映像的.rodata段,在语法上支持const常量的属性,只要在代码中修改了const常量的值,编译器就可以检测出来。const常量还具有宏常量不具备的类型检查的优点,提高了代码的安全性。

  1. 定义:被const修饰的成员带有常属性,即语法上限制其不可修改,如果是变量,则该变量一旦被初始化,则不可以再次修改它的值;如果是成员函数,则该函数不能修改类中的普通成员变量。

  2. 适用场景:

    • const修饰函数参数,表示该参数是输入型参数。一般和引用同时使用。
    • const修饰函数返回值
    • const修饰类成员变量,则该成员在构造函数的初始化列表中必须初始化。
    • const修饰成员函数(实际上修饰的是this指针,所以static成员函数和友元函数不可以被const修饰),表示在该函数中不可以修改类的任何普通成员。

注:如果类中某个成员变量以后需要修改它的值,即在被const修饰的成员函数中也可以修改它的值,则可以将其用mutable关键字修饰。

3.几个问题:

  • const对象可以调用非const成员函数吗?不可以
  • 非const对象可以调用const成员函数吗?可以,不推荐
  • const成员函数内部可以调用非const成员函数吗?不可以
  • 非const成员函数内部可以调用const成员函数吗?可以,不推荐
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值