首页 > 编程语言 >Effective C++ - 条款2 - in-class初值设定问题

Effective C++ - 条款2 - in-class初值设定问题

时间:2022-08-17 23:59:36浏览次数:56  
标签:const Effective 初值 成员 enum C++ static class

pre

针对Effective C++ (55条)中的每一个条款写一个blog。

0x02 尽量以const, enum, inline 替换 #define

为什么需要这样做?因为使用define会使得变量被define的符号替换,在遇到错误时提示的是替换后的符号而非原始定义的符号,引起误解,因此应使用const替换。而如果是在类的作用域中,为了保持只有一份该数据,要声明为static。因此就要考虑static+const。

前置知识

  1. const成员变量的初始化必须通过初始化列表实现
  2. static成员变量在类内声明,在类外初始化。(因为static成员不属于对象,属于类,为了保持仅有一份的语义,这块内存应该在类外分配,而内存分配是在定义时完成的,因此类内static成员仅能声明,不能定义,即不能分配内存)
  3. static成员变量在类内声明时不要给初始值,以免老版本编译器不允许【in-class初值设定】问题。
  4. static成员在类外定义时不能加static关键字。

正确实现方法

  1. 如何做?
class GamePlayer {
private:
  enum {NumTurns = 5};
  int scores[NumTurns];
  ...
};
  1. 为什么?
    因为有时候需要在编译时知道const值,为了避免【in-class初值】问题,借用enum来实现。

其理论基础是,enum的数值可以被视为整数类型。而整数类型允许【in-class初值】

标签:const,Effective,初值,成员,enum,C++,static,class
From: https://www.cnblogs.com/ijpq/p/16597204.html

相关文章

  • c++基本编程体验第3节之命名空间
    3.1、何为命名空间3.1.1、命名空间的引入(1)命名空间namespace,是c++引入的一种解决全局变量和函数名冲突机制(2)c语言没有namespace,但是c++及之后的javapy......
  • c++ 实现hashmap
    由于hashmap不是c++stl中标准实现,这样在跨平台使用时就可能会出现问题,于是想到自己实现一个hashmaphash算法使用开链法解决hash冲突,主要实现了添加,删除,查找几个方法头文......
  • C++primer练习14.26
    练习14.26为你的String类定义下标运算符char&operator[](size_td){returnelements[d];}constchar&operator[](size_td)const......
  • 【StoneDB Class】入门第三课:StoneDB的编译安装
    本课程主要介绍StoneDB-5.6在Ubuntu20.04LTS下的手动编译,在CentOS和RedHat的编译详见官方文档。如果想快速部署,详见官方文档https://stonedb.io/zh/docs/getti......
  • 【StoneDB Class】入门第二课:StoneDB整体架构解析
    StoneDB的整体架构分为三层,分别是应用层、服务层和存储引擎层。应用层主要负责客户端的连接管理和权限验证;服务层提供了SQL接口、查询缓存、解析器、优化器、执行器等......
  • C/C++ 如何拷贝一个wchar_t类型的字符串
    1Dothis,23wchar_tclone[260];45wcscpy(clone,szPath);67Or,ifyouwanttoallocatememoryyourself,89wchar_t*clone=newwchar_t[wc......
  • C++ 起别名
    可以基于typedef、using等关键词实现typedef std::vector<int>intvec;using intvec =std::vector<int>; //这两个写法是等价的另一个例子,函数指针:typedefvoid(*......
  • 基于C++的OpenGL 13 之Mesh
    1.引言本文基于C++语言,描述OpenGL的Mesh前置知识可参考:基于C++的OpenGL12之多光源-当时明月在曾照彩云归-博客园(cnblogs.com)笔者这里不过多描述每个名词、......
  • 基于C++的OpenGL 14 之模型加载
    1.引言本文基于C++语言,描述OpenGL的模型加载前置知识可参考:基于C++的OpenGL13之Mesh-当时明月在曾照彩云归-博客园(cnblogs.com)笔者这里不过多描述每个名词......
  • C++primer练习14.10-23
    练习14.10对于Sales_data的输入运算符来说给定下面的输入会发生什么?(a)0-201-99999-91024.95正常输入(b)1024.950-210-99999-9最后一个输入格式错误,会chongz练习14.11......