类和对象【五】const成员和static成员

const修饰的成员和对象

const修饰成员变量

此时和const修饰普通变量一样

只改变了成员变量的属性【从可读可写–>只读】,即const修饰哪个成员变量那个成员变量就的值就不能再被修改了

在这里插入图片描述

被const修饰的成员变量只能在成员初始化列表中赋初值

因被为const修饰后就该成员变量就具有了常属性,就跟常量一样不能赋值改变,所以const修饰的变量只能在定义初始化的时候获得初始值,之后就改变不了了

而成员初始化列表【不了解的可以看我这篇文章:类和对象【二】this指针,构造函数和成员初始化列表【超详细】
就是对象中存储的成员变量定义和初始化的地方


在这里插入图片描述


const修饰成员函数

  1. const要放在成员函数声明和定义的()后面

  2. const修饰成员函数时,其实修饰的是 *this,即此时成员函数中的this指针的类型是
    const A(类名)* const this

  3. const修饰的成员函数中不能对当前类的任意成员变量(除了静态成员变量【因为静态成员变量没有存储在对象中】)进行修改,但是可以访问
    因为2中提到的const修饰成员函数时其实修饰的是 *this所以不能通过this的解引用去修改this指向的对象中存储的数据了,也就是this可以指向的非静态成员变量不能被修改了

    在这里插入图片描述
    在这里插入图片描述
    4.在类中的成员变量声明时加上mutable可以让它在const修饰的函数中也可以修改

    在这里插入图片描述


const修饰对象

  1. const修饰的对象中存储的数据就不能被修改了,也就是存储在对象中的任意一个成员变量都不能被修改[static修饰的成员变量可以被修改,因为static修饰的成员变量不存储在对象中]

  2. const修饰的对象只能调用const修饰的成员函数
    因为const修饰了对象之后,要保证在任何时候对象中的数据都不能修改
    所以对象调用成员函数时,在成员函数中也不能改变对象中的数据,只有const修饰的成员函数可以保证这一点


static修饰成员和对象

static修饰成员变量

  1. static修饰的成员变量在一个类中只有一份,且它不存储在任何一个对象中
    任何一个对象都可以访问他,但访问到的都是同一个同一片内存的数据成员
    [所以如果有一个修改了static修饰数据成员,那么其他的对象去访问的时候,访问到的是被修改之后的static修饰数据成员]

    在这里插入图片描述

  2. static修饰的成员变量是存放在全局区,而且它的生命周期也和全局变量一样长

  3. static修饰数据成员只在类里声明定义和初始化在全局中
    因为static修饰的变量必须初始化,而成员变量初始化只能在成员初始化列表中初始化
    但是它没有存储在对象里,所以它不能用成员初始化列表初始化
    而且它要存储在全局区

  4. static修饰数据成员,可以用类名+::访问

    在这里插入图片描述

  5. static修饰的成员变量不能在类里给缺省值
    因为缺省值是传给成员初始化列表的
    成员初始化列表只能定义和初始化对象里存的成员


static修饰成员函数的特点

  1. static修饰成员函数,可以用类名+::的方式调用

    在这里插入图片描述

  2. static修饰成员函数中不能有不是静态成员的成员

    在这里插入图片描述
    [因为static修饰的成员变量和成员函数的生命周期,比普通类的成员的生命周期更长,这样就可能会出现调用static修饰成员函数时,普通的类的成员没有初始化/这个成员已经被销毁的现象,所以直接禁止了]

  3. static修饰成员函数中没有this指针
    [因为static修饰的成员变量和成员函数的的生命周期比普通的对象的生命周期都长,就有可能出现,调用static修饰成员函数时,对象还没有创建/已经销毁的情况,因为this指针指向调用成员函数的对象的,如果这个对象对象还没有创建/已经销毁,那this就是野指针了]


static修饰的对象

  1. static修饰的对象的生命周期和全局变量一样长

  2. 局部域中的static修饰的对象创建是代码执行到的时候才创建,而不是和全局域中的一样在main函数调用之前就创建了

评论 60
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值