EffectiveC++
2019-08-16 07:56:23来源:博客园 阅读 ()
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函数替换掉
原文链接:https://www.cnblogs.com/congrifan/p/11267596.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 单独编译 2020-05-10
- 博弈--尼姆博弈 2020-05-03
- 图 2020-05-02
- C++ 函数重载 2020-04-21
- DSA_02:复杂度分析 2020-03-28
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash