科锐课堂笔记:2017/4/11 类的const与static

  常量对象,同其他基本常量类型一样,只能访问公有数据成员而无法修改其值,对于成员函数,也只能调用常成员函数(末尾用const修饰)。我们知道类的成员函数都隐含一个this参数,指向对象地址,普通成员函数的this指针是class T *const类型,允许修改内部成员,而常成员函数的this指针是const class T *const类型也就无法修改内部成员,所以可以被常量对象所调用。一般而言对于只要获取内容不作修改的,如Get系列函数定义成常成员函数后能让编译器帮你作检查操作。如果想在常成员函数或常量对象直接修改数据成员,使用mutable关键字修饰该数据成员,便可脱离编译器的限制。
  类中的const数据成员,按照const语法规定必须在定义一个常量时初始化,而C++语法又不允许在类声明里对数据成员初始化,那么在构造函数内部进行赋值操作呢?也不行那样变成赋值了而常量恰恰是不能被赋值改变的,所以C++在构造函数加了一个初始化列表(函数后用:分隔初始化列表),把这些在定义时就必须初始化的数据成员(const常量、类对象)统统写在初始化列表里(对于调用默认构造函数的类对象数据成员,编译器会隐式将其添加到列表后面),成员名加上小括号,括号里写上初始值。VC6编译器对列表中的每个数据成员,按照成员在类声明时定义的先后顺序逐一进行初始化(所谓初始化一定是在代码执行之前,也就是进构造函数之前,假设有多个构造重载函数,必须在所有构造函数后都填上初始化列表,以保证被初始化)。我们把类的数据成员类型是另一个类,或者说类中包含了类叫作组合,从组合的结构关系上看,类数据成员构造函数要早于组合构造函数,而在组合析构完后再析构类数据成员,这些代码都由编译器生成插入而成。


  类中的static成员,凡是静态的编译器都会放在全局区里,类的静态数据成员和静态成员函数除了被编译器加了一个类域作用域的限制,其他行为同全局无异,是所有类对象共享的(只占有一份)。
  先说静态数据成员,以上可知静态数据成员是在全局数据里,而不在类对象中,所以它不占类对象的空间,静态既然在全局,说明早在对象创建之前就已经存在并被初始化了,所以类的静态数据成员不能在类内部初始化,必须在类外部初始化(像一般全局变量一样,只是加上类域),记得别初始在头文件中以免有多个文件使用该类时造成重复定义。
  再说静态成员函数,成员函数本身就是所有类对象共享的,那么静态成员函数与普通成员函数有什么区别?同理静态成员函数在类对象之前就存在了,所以没有对象也能直接调用(加上类域),这样一来静态成员函数肯定是没有this指针参数的,不能直接引用修改类的内部成员,因为静态成员函数与静态数据成员同属一个类域下,所以能直接访问静态数据成员。另外一点,无论静态数据成员或函数,都被编译器加上类域限制名称粉碎化后,减少了与其他全局的名称冲突。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值