类中的专属常量,static修饰的常量
为了将常量限制在类中,只有将常量定义为成员变量+const+static才可以,注意这里是不会经过构造函数的,只有我们在调用头文件的时候,在执行文件中进行声明。
或者c++允许在类中进行定义的时候进行初始化,但是只有int类型变量可以,后面c++11又允许double 类型,总之,我们尽量在类中只进行声明,在执行的.cpp文件中
//比如说这里是.h的文件
class A{
public:
private:
const static int num = 1;//这种是可以通过的,即
//在定义的同时进行初始化,这里有没有const 无所谓
const static double num2 = 1.0//同样可以
const static float nums3 = 1.0//wrong,不允许
}
//下面我们来给出一种标准的解决的方式
//this is a file named ...h
class GamePlayers{//假设这里是一个管理游戏在线人数的/类
public:
private:
static int gameplayerNums;//首先在这里进行声明
}
// this is a file named ...cpp
//首先这个函数我们需要调用上面那个类,因此我们直接在外部对其进行初始化
static int GamePlayers::gameplayerNums = 5;
//后面的进行调用即可
int main()
...
尽量用const enums inlines去替换#define
在C语言中,我们很多时候对于一些常量或者说是一些简单的函数我们一般是采用的是预处理的方式
#define Nums 3.14
#define Add(a,b) ((a)+(b))
#define Larger(a,b) ((a)>(b)?(a):(b))
#define定义的函数
这种方式就是我们常见的预处理的手段,这里采用和c++中的inline内联函数很相似,就是直接将这个部分用后面的部分去替换,但这也是很有风险的
比如说对于上面的Larger函数,如果我传递下面的两组数据呢
int a = 0,b = 1;
int ret = Larger(a,++b)
不难发现b++被执行了两次,我们首先回忆一下为什么我们要这样写,因为在C语言中没有定义重载函数,并且对于这种通过#define定义的函数,这种函数会直接在后续调用他的时候进行展开,减少了函数的调用增加了代码运行的效率。在c++中我们有与他具有一样功能并且没有上面问题的方式去解决上面的问题
template <class T>
inline const T Larger(const T& lhs,const T& rhs){
return lhs > rhs ? lhs : rhs;
}
我们通过模版template 实现相同的功能,并且通过inline实现了函数的内联
#define定义的变量
- 先来说一说第一种方法就是通过定义const static 修饰的全局变量来进行运用,这种是我比较推荐的
- 第二种的就是被称作enum hack的方式来进行调用,即定义一个无名的enum来方便全局进行访问
enum {
nums = 1,
}
总结
这里就是effective c++的第一章读完后我的全部感想和启发,有一些摘录的内容,大部分是自己的总结和经验