《Effective C++》条款01、02(以const,enume,inline,替换#define)

1.条款01:视C++语言为一个联邦

C++语言的四大部分主要如下图所示:
在这里插入图片描述
这也是对问题C语言和C++语言有什么不同? 的最佳回答之一。


条款02:尽量以const,enume,inline,替换#define

如下的一个定义:

#define  RATIO 1.6352

对于预编译的的变量,并不会进入到符号表中,当程序报错时可能对反馈数据1.6352出错,而不是RATIO变量。所以C++语言中用以下语句代替。

const double Ratio = 1.6352;

作为常量,Ratio将会进入符号表,且所有的机器码中出现的也将是Ratio,而不是1.6352;

两种特殊情况:

  • 1
    定义常量指针时,我们一搬用string对象代替char *;
    const char * const Name="Scott";
    
    这样需要两次使用const,且代码的可读性不强,一帮用
    const std::string Name("Scott");
    
    来代替上述定义。
  • 2

对于类专属的常量,我们一般将其声明为const常量,为了保证该常量只有一个实体,我们需要将该常量声明为static类。

class A
{
private:
	static const int Num=5;
	///......
}

有些编译器不能在声明static变量时进行赋值,所以需要在实现文件中定义。

class A
{
private:
	static const int Num;
	///......
}

//实现文件中初始化
const int A::NUm=; 

因为#define没有作用区域,所以不能用#define为类声明专属变量。

enum hack
上述的程序当我们在类外初始化静态成员,但是我们在类的需要用到该数,那么这个时候就会报错。

class A
{
private:
	static const int Num;
	int arr[Num];//错误,Num没有初始化
}

//实现文件中初始化
const int A::NUm=5; 

为了解决上诉的情况,我们可以用enum hack技术,即我们可以用enum类型声明的成员代替int类的常量。

class A
{
private:
	enum{ Num=5 };
	int arr[Num];
	///......
}; 

用enum hack更能接近#define的功能,因为enum和#define通常都是不能取地址的,这样别人就不能获得专属常量的指针或者引用。而且enum hack是模板编程技术的基础。

用inline代替宏函数
对于宏函数,C语言中用来节省函数调用的开销,但是宏函数的调用容易产生错误。

#define MAX(a,b) (a)>(b)?(a):(b)

即使加上括号,这个宏函数依然是不安全的。

int a=5,b=0;
MAX(++a,b); //a被累加两次
MAX(++a,b+10);//a被累加一次

为了避免宏函数带来的不安全,一般会用inline和模板编程实现上述函数。

template<typename T>
inline int Max(const T& a,const T& b)
{
	return a>b?a:b;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值