C++ 第二次学习

1.Bool类型

2.内联函数

3.引用

4.函数重载与参数缺省

Bool类型

1.独属于c++的逻辑类型

2.取值为true或false,但在控制台输出为1/0

3.定义方式 (与基本类型类似)Bool istrue =1;

4.内存大小占用1字节

内联函数

​ 内联函数是程序员对编译器提出的一个建议,建议编译器在编译程序代码的时候,把该函数的代码 内嵌到程序代码中具体调用该函数的位置,将这个函数放在代码区,调用时不再进出栈区,由此提高程序执行效率,节省栈区空间。但是具体是否内联成功,还是要由编译器决定。

​ 内联函数的关键字为 inline ,将关键字放在所要内联的函数的定义之前,注意,是定义,放在声明前是没意义的。

​ 不是所有函数都适合内联的,一般我们将要重复调用并且函数代码简单(一般不超过10行)(简单运算或者赋值)设置为内联函数。此外,还有一些补充点:
​ ①内联函数中不建议使用循环或者开关语句,这样有违内联函数初衷,会导致代码膨胀,有些编译器会报错,有些不会。

​ ②在类内定义的成员函数都是内联函数。

​ ③递归函数、虚函数等不会被正常内联

内联函数的应用

一:定义类成员变量的存取函数

1
2
3
4
5
6
7
class demo{
 private:
  int a;
 public:
  int read(){ return a;} //读取成员变量
  void set(int I) {a=I;} //设置成员变量
}

二:实现宏的效果

宏在使用时,不进行参数检查,容易出现二义性。比如实现计算x平方:

1
#define TABLE_MULTI(x) ((x)*(x));

若输入参数为表达式:a++; (a=4),

​ 他们本意是希望得到(a+1) (a+1)的结果,而实际上呢?我们可以看看宏的展开结果: (a++) (a++),如果a的值是4,我们得到的结果是5*6=30,而我们想要的是25。

改为内敛函数则无此歧义,因为内敛函数是真正的函数,执行的是函数的调用。

1
inline int square(int x){ return x*x;};

引用

取引用的符号是& ,这与变量的取址符不一样。取引用就是一个取别名的过程。

1
2
int a=0;
int& b=a;//注意:定义的适合一定要初始化,否则报错!!!

如上述,定义了一个a的引用,结果:

①b就是a,b可以当作a使用;

②取引用就不能修改引用的对象;

函数重载

函数重载的条件是函数名一致,参数列表不一致,所谓的参数列表不一致,就是:

参数列表的参数个数、参数类型、参数顺序不一致(满足一个即可);

函数重载要避免产生的二义性:(当参数不匹配时,编译器的隐式转换作祟)

看一个例子:

1
2
3
4
5
//有两个函数add,构成重载
double add(float a);
double add(int a);
//调用函数add
add(2.5);

此时,2.5实际上为double类型,找不到匹配的参数,编译器会强转这个double类型参数,可以转为int,也可以转为float,编译器不知道怎么做,会报错。

解决方式:①再写一个匹配的函数;

​ ②改变传入的参数,可以使用显式转换。

1
add((int)2.5)

参数缺省

函数参数缺省本质就是设置默认值,要求从右到左缺省。缺省的设置在函数的定义或声明其中一个中完成就可以。

注意:缺省值只能是常量

函数缺省要避免与函数重载产生二义性:

1
2
3
4
5
//有两个函数
void getnum(int a,int b,int c=1);
void getnum(int a,int b);
//调用
getnum(1,2);

此时编译器不知道是调用两个函数中的哪一个,会报错

解决办法:没有,只能取消缺省或者取消重载。