TOP

EffectiveC++
2019-08-14 00:09:03 】 浏览:73
Tags: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++ https://www.cppentry.com/bencandy.php?fid=49&id=228552

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇2019.08.02 云从科技C++后台开发 下一篇编程题常见输入格式处理方法