// 条款02: 尽量以const,enum,inline 替换#define
// 尽可能的使用编译器而不是预处理器
#include <iostream>
// 1. 定义class专属常量(用const代替define)
// A. 不能用#define,因为define不重视作用域(scope)
// B. 用const,static修饰。用const因为不能被改变,用static因为所有的对象共享这一个变量
// C. 在class中const,static修饰的int类型需特殊处理,可以在类中赋值,但是这只是声明而不是定义,
// 可以取值使用,在取地址时,最好还是要外部定义。
// D. 定义类中常量的方法是,类外面定义,类里面声明。
// 2. 用enum代替define
// 理论基础: 一个枚举类型的数值可以充当int类型被使用
// 3. 对于形似函数的宏,用inline函数来代替#define
class Circle {
private:
enum {
Num = 5 // 枚举类型被默认为int类型
};
public:
static const int A = 5; // 正确,这只是常量声明式,只用取地址时c++编译器才会给它开辟内存
double a = 5; // 正确,说明c++ 中成员变量可以直接赋值
//static const double Pi = 3.14; //错误
//错误:: a static data member with an in-class initializer must have non-volatile const integral type
static const double Pi; // 声明常量
int array[Num]; // 声明数组
};
const double Circle::Pi = 3.14; // 定义常量
int main02() {
Circle *c1 = new Circle();
std::cout << Circle::A << c1->A << std::endl; // 正确,可以访问
std::cout << &Circle::A << std::endl; // 正确
std::cout << c1->a << std::endl; // 正确
std::cout << c1->Pi << std::endl; //正确
std::cout << Circle::Pi << std::endl; // 正确
//c1->Pi = c1->Pi + 1; // 错误
return 0;
}
条款02:尽量以consts,enum,inline替换#define
原创哲这这 博主文章分类:Effective C++ ©著作权
©著作权归作者所有:来自51CTO博客作者哲这这的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:02C++单例模式线程安全问题
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Effective C++条款02:让自己习惯C++之(尽量以const,enum,inline替换#define)
一、为什么不推荐使用#define在程序中你可能会
尽量以const enum inline替换#define #define -
条款01~02
01:视C++为一个语言联邦C++是个多重范型的联邦而非单一语言。在其某个次语
#define 编译器 预处理