【Effective C++】第一章 自己习惯C++

目录

 

一、自己习惯C++

1、尽量使用const代替define

2、enum hack

3、尽量使用const

4、确定对象被使用前已先被初始化


一、自己习惯C++

1、尽量使用const代替define

const:编译器处理,有语法检查,类型检查,有作用域(如今优秀的编译器在底层实现const:把const存入一个符号表中,也不会分配内存,当对其取地址时,会另外分配内存

define:预处理器处理,只是简单替换,无类型检查,不提作用域(无封装性可谈),不会有内存分配,实现宏函数(不会导致函数调用带来的额外开销,只是简单替换匹配,可用inline代替(遵守作用域和访问规则)

注意:class专属常量。为了将常量作用域限制在class内,必须让它成为class的一个成员;而为确保此常量至多只有一份实体,必须让它成为一个static成员

例如:static const int num=5;  //常量声明式

若是一个class的专属常量又是static,则可以声明并无需提供定义式。

class TestConst
	{
	public:
	protected:
	private:
		const int a = 10;         //只是一个常值而已,不能保证只有一个实体
		static const int b = 20;  //若是const+static则可以只需要声明,且保证只有一个实体
		//static int c = 30;  //必须在类外定义
		static int c;
	};
	//static int TestConst::c = 30;  //static是一个修饰关键字,不包括在类型中
        //在类外定义
	int TestConst::c = 30;  //定义时:类型 类名::变量名=值

2、enum hack

        enum更像#define,当不想让别人获得一个pointer或reference指向你的某个整数常量时,enum可以实现这个约束。不会导致非必要的内存分配

总结:对于单纯常量,最好以const对象或enums代替#define。

           对于形似函数的宏,最好改用inline函数替换#define。

3、尽量使用const

  • 可帮助编译器侦测出错误用法,const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。
  • 编译器强制实施bitwise constness(非我所欲),但编写程序时应该使用“概念上的常量性”。
  • 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。

4、确定对象被使用前已先被初始化

       对象的成员变量的初始化动作发生在进入构造函数本体之前。在构造函数中,只能叫做赋值。用成员初值列表代替赋值动作,但效率更高

赋值版本:

ClassCopy::ClassCopy(int a,int b)
{
    m_a=a;
    m_b=b;
}

初始化过程:首先调用default构造函数为m_a,m_b设初值,然后立刻再对他们赋予新值。所以default构造函数的一切作为因此浪费。 

 成员初值列表版本:

ClassCopy::ClassCopy(int a,int b):m_a(a),m_b(b)
{
}

初始化过程:初值列表针对各个成员变量而设的实参,被拿去作为各成员变量之构造函数的实参,即m_a以a为初值进行copy构造,m_b以b为初值进行copy构造。

 总结:比起先调用default构造函数然后再调用copy assianment操作符,单只调用一次copy构造函数是比较高效的。若想要default构造一个成员变量,在使用成员初值列表时,只要指定无物作为初始化实参即可。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烊萌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值