EffectiveC++

2019-08-16 07:56:23来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:洛谷 P1901 发射站

下一篇:洛谷 P2947 [USACO09MAR]向右看齐Look Up