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);