由static关键字引发的知识点学习和在类中的使用相关注意事项


比较基础的是:在类中如果定义了static静态数据成员,在类中声明,但是在定义时需要在类外,而不能使用构造函数。比如:
//test.h
class test {
private:
             static int num;
……
在类实现文件中,给出定义和初值:
//test.cpp
int test::num = 5;
……

test类的所有对象共享这个静态变量。一般来说,是不能在类声明中初始化静态数据成员的,不过有两种例外情况:(c++ primer plus 428页)
1.static const int 
2.枚举型const

但是即使是例外情况,它仍然只是声明。

有一种应用场景是,如果想把符号常量放入类的作用域内,比如对所有对象来说,数组的长度时固定的,这个时候,如果你这样做:
class Bakery{
private:
    const int Month = 12;
    double cost[Month];
……

但这样是不对的(c++ primer plus 371页),因为上述只是对Month的声明而非定义,而且此时类处在声明阶段,还没有分配存储,此时赋给Month初值是错误的。
由上文知,static int类型的变量可以在类声明中赋初值,因此,可以改写如下:
class Bakery{
private:
    static int Month = 12;
    double cost[Month];
    ……
这样是可以的,但是需要补充的是(effective c++第15页),由于它是static类型的静态数据,而上述又只是声明,因此必须在类实现文件中写:
const int Bakery::Month;
这个时候不需要给值,因为在声明中已经给过了。

还有一种可替代的解决办法,即使用enum:
class Bakery{
private:
    enum{Month = 12};
    double cost[Month];
    ……

需要注意的是:并不会创建类数据成员,所有对象中都不会包括枚举。Month只是一个符号名称,在作用域为类的代码中遇到时,编译器直接用12来替换。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值