EffectiveC++
宁可以编译器替换预处理器
define 不被视为语言的一部分,因此也就有可能在预处理阶段被优化掉,导致相关变量出现错误。
#define ASPECT_RATIO 1.63
//可以尝试将其替换为
const double AspectRatio=1.63
这里注意一下大写名称常用于宏,因此,转写时候将相关名称进行了相应的替换
1.定义常量的指针constant pointers 由于定义式通常被放在头文件内,因此有必要将指针声明为const
若要在头文件内定义 一个常量
char * based字符串
必须要写两次
const char *const authorName="ScottMeyers"
或者在C++中将其写成如下格式
const std::string authorName("ScottMeyers");
2.class 专属常量,为了将常量的作用域(scope)限制于class内,你必须让他成为class的一个成员member;而为了确保此常量至多只有一份实体,它就必须有必要成为static成员
class Sem
{
private:
static const int isnum=5;//这里是常量式的声明
int scores[isnum];
public:
void std_print()
{
std::cout<<isnum;
std::cout<<" ";
for(auto s:scores)
{
std::cout<<s<<" ";
}
std::cout<<std::endl;
}
};
private:
static const int isnum=5;//这里是常量式的声明
int scores[isnum];
private:
static const int isnum;//将声明放在头文件里面
const double Sem::isnum=5;//将实现放在文件中
private:
enum {isnum=5};//the enum hack补偿做法,即一个属于枚举类型的数可权充int 被使用
int scores[isnum];
关于宏与内联函数:尽量以内联的模板函数代替宏(类似于实现函数功能的宏)
#include <iostream>
#define CALL_WITH_MAX(a, b) ((a) > (b) ? (a) : (b))
int main()
{
int a = 5, b = 0;
CALL_WITH_MAX(++a, b);//这里的++会执行2次
std::cout << a << " " << b << std::endl;
CALL_WITH_MAX(++a, b + 10);//这里的++就执行一次
std::cout << a << " " << b << std::endl;
}
原因:第一次执行的宏从简单替换开始返回到a后再执行一次++
而第二次执行的宏因为没有返回到a,这次返回到的是b所以不会有第二次++
相反的若要替换成功能相同的内联函数就不会出现这样的问题
template <typename T>
inline T CallWithMax(const T&a,const T&b)
{
return (a>b?a:b);
}
如此而言,对于单纯的常量,最好用const对象或者enums替换掉#defines
对于形似函数的宏可以用inline函数替换掉
EffectiveC++的更多相关文章
- [EffectiveC++]item04:Make sure the objects are initialized before they're used
28 页 C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前. 构造函数的一个较佳的写法是,使用所谓的member initialization list替换赋值动作. 29页 但请立下 ...
- [EffectiveC++]item34:区分接口继承和实现继承
[EffectiveC++]item34:区分接口继承和实现继承
- effectiveC++ 内存管理 学习笔记
1.尽量使用初始化列表而不要再构造函数里赋值,初始化顺序和声明的顺序一致,一些类型如const,引用等,必须使用初始化.对于非内部数据类型成员对象应当采用初始化表,以获取更高的效率.example:B ...
- effectivec++条款18,让接口容易被正确使用,不宜被吴勇
test* create_test(); shared_ptr<test> create_test();//下面的接口比上面的接口要好 auto_ptr<test> creat ...
- EffectiveC#18--用IComparable和IComparer实现对象的顺序关系
1..Net框架提供了接口来描述对象的顺序关系:IComparable 和IComparer. 2.IComparable 为类定义了自然顺序,实现IComparer接口的类可以描述其它可选的顺序 3 ...
- EffectiveC#03--用委托表示回调,用事件定义对外接口
1.回调的场景:我给了儿子一个任务且他可以报告状态来(重复的)打断我.而我在等待他完成任务的每一个部份时不用阻塞我自己的进程.他可以在有重要(或者事件)状态报告时,可以定时的打断我,或者向我询求帮助 ...
- EffectiveC#02--仅在对基类进行强制更新时才使用new修饰符
1.建议避免使用new修饰符来重新定义非虚函数. 非虚方法是静态绑定的,不管哪里的代码也不管在哪里引用, 它总是严格的调用类中所定义的函数.并不会在运行时在 派生类中查找不同的版本. 2.何时使用ne ...
- EffectiveC#01--避免返回内部类对象的引用
此篇是对00中第3点的再一次阐述. 1.如果一个属性返回一个引用类型,那么调用者就可以访问这个对象的公共成员,也包括修改这些属性的状态. public class MyBusinessObject { ...
- EffectiveC#00--选择定义和实现接口,而不是继承
1.继承就是说它是某物(is a的关系),针对相关类,而接口是说它有某个功能(behaves like.)可以是不相关的 基类是描述对象是什么,接口描述对象有某种行为. 2.不能在接口里提供任何成员的 ...
- EffectiveC#17--装箱和拆箱的最小化
1.如下这段代码会经历装箱和拆箱.例如25会先装箱成object后传递给writeline方法(一次拷贝),在方法内部又 经历拆箱成int(第二次拷贝)后然后调用tostring(). Console ...
随机推荐
- PHP 之文件上传类封装
一.前端代码 <!doctype html> <html lang="en"> <head> <meta charset="UT ...
- 探讨一下js中的继承和原型链
---恢复内容开始--- 每个JS对象一定对应一个原型对象,并从原型对象继承属性和方法. 也就是说 对象的__proto__属性的值就是它所对应的原型对象, 而prototype 只有函数才有的属性. ...
- white-space 标签 使用
white-space MSD定义为: 是用来设置如何处理元素中的空白 其使用场景有很多,比如:横向滑动,超出显示省略号,输出空格显示空格等 1.横向滑动 在写手机页面的过程中,我想大部分人都遇到横向 ...
- 通过xshell在本地win主机和远程linux主机传输文件
1.下载和安装xshell此处不再介绍 2.安装lrzsz的软件 yum install lrzsz 3.通过xshell上传文件 只需要在XShell的菜单中点击File – Transfer – ...
- mysql 误删除所有用户或者忘记root密码
/etc/init.d/mysqld stop //停止数据库/etc/init.d/mysqld restart //启动数据库(1)开启特殊启动模式mysqld_safe --skip-grant ...
- concurrency parallel 并发 并行 parallelism
在传统的多道程序环境下,要使作业运行,必须为它创建一个或几个进程,并为之分配必要的资源.当进程运行结束时,立即撤销该进程,以便能及时回收该进程所占用的各类资源.进程控制的主要功能是为作业创建进程,撤销 ...
- [转][C#]无法创建虚拟目录。ASP.NET 2.0 尚未在 Web服务器上注册。
参考:http://www.bubuko.com/infodetail-997666.html C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet ...
- 17. dashboard
17. dashboard dashboard的安装步骤: wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-bet ...
- python3 super().__init__() 和 __init__() 的区别
1.单继承 super().__int__()和 Base.__init__(self)是一样的, super()避免了基类的显式调用. class Base(object): def __init_ ...
- .Netcore 2.0 Ocelot Api网关教程(8)- 缓存
Ocelot中使用 CacheManager 来支持缓存,官方文档中强烈建议使用该包作为缓存工具.以下介绍通过使用CacheManager来实现Ocelot缓存. 1.通过Nuget添加 Ocelot ...