第15章 宏和模版

1.在编译c++文件是,编译器先对其进行预处理,然后再编译。预处理命令以#开头,编译器会修改#开头的语句,然后把修改后的内容输出,进行编译

2.预处理仅仅是纯文本替换,不会做上下文的检查

3.宏函数。#define可以创建宏函数,并且能够像函数那样接受参数

#define twice(x) ((x)*2)

如果在程序中含有如下代码

twice(2)

那么最后会替换成 ((2)*2),结果就是4

 

宏还可以接受多个参数

#define max(x,y) ((x)>(y) ? (x):(y))

int x=5, y=7, z=0;

z=max(5,7);

最后z的值就是7

 

为什么我们在宏定义的时候使用了那么多的看似没用的括号。那是因为宏函数在预处理的时候只是纯文本替换,不会做正确性的检测,那么在程序中就会出现不可预知的问题。比如宏定义中是个加法运算,但是程序中调用了宏后,紧接着进行了乘法运算,那么如果没有括号进行约束,导致的结果就是先进行了后面的乘法运算,而后进行前面的加法运算,而不是我们的预期,先进行宏的加法,再进行后面的乘法

4.一个宏必须在同一行内定义完,如果宏比较大,那么可能导致看起来比较吃力。所以c++提供了一个符号 \ ,用这个符号,可以进行换行管理

每调用一次宏,宏就会以内联的方式展开在调用的地方,这样会增加程序的内容,但是省去了函数调用的开销

5.模版。模版是c++最强大但最少用的特性之一。模版可以让程序员定义一种适用于不同类型对象的行为

6.声明模版

template <typename type>

type getmax(type value1, type value2)

{

if(value1>value2)

return value1;

else

return value2;

}

上面template 是声明模版的关键字,typename 是定义一个类型。这个有使用模版的时候决定。下面的getmax是模版实现的函数。比如下面的调用:

int a = 3;

int b = 4;

int max = getmax<int>(a, b);

上面就是调用模版。getmax是这个模版,我们指定了里面的typename 对应的type为int。就相当与调用一个函数

int  getmax(int value1, int value2)

{

if(value1>value2)

return value1;

else

return value2;

}

7.模版类

模版类和上面的模版函数差不多,就是定义了一种行为,但是没有指定其具体的类型:

template <typename t>

class tempclass

{

public:

void setv(t value){mvalue = value;}

t getvalue(){return mvalue;}

private:

t mvalue;

}

这样,我们就可以用它来实例化一个类了。

tempclass <int> myclass;

myclass.setvalue(5);

tempclass<double> myclassd;

myclassd.setvalue(4.3);

8.我们可以为模版指定默认的参数

template <typename t1=int, typename t2=int>

class myclass{};

这样当我们在使用时就可以写成

myclass<> a(4, 5);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章