一,内联函数的和宏函数的概念:
宏函数(带参数的宏)的缺点: 第一个在c中也会出现,宏看起来像一个函数调用,但是会有隐藏一些难以发现的错误。 第二个问题是c++特有的,预处理器不允许访问类的成员,也就是说预处理器宏不能用作类 的成员函数
内联函数:内联函数为了继承宏函数的效率,没有函数调用时开销,然后又可以像普通函数 那样,可以进行参数,返回值类型的安全检查,又可以作为成员函数 内联函数:是一个真正的函数。函数的替换 发生在编译阶段
如以下代码:
inline int my_add(int a,int b)
{
return a+b;
}
void test()
{
cout<<"3+3= "<<my_add(3,2)<<endl;
}
对于一个类内部定义的函数都会自动称为内联函数
内联函数有三个要求:
1、不能存在任何形式的循环语句
2、不能存在过多的条件判断语句
3、函数体不能过于庞大 不能对函数进行取址操作
注:如果不符合条件编译器会当做普通函数处理
内联仅仅是简单的给编译器一个建议,并不一定会采取建议(可能并不会编译成为内联函数)
二,函数的默认(缺省)参数
c++在声明函数原型的时可为一个或者多个参数指定默认(缺省)的参数值,当函数调用的时 候如果没有传递该参数值,编译器会自动用默认值代替。
void test01(int a = 10,int b = 100)
{
return a+b;
}
如果调用函数时候正确传参,则并不会使用对应的默认参数
**注意:
1,设置默认参数时候,如果一个参数设置了默认参数,那么后面的几个也必须要设置默认参数
2、如果函数声明和函数定义分开写,函数声明和函数定义不能同时设置默认参数
三,函数的占位参数:
顾名思义就是为了占位置的,只给类型
函数的参数只有类型名 没有形参名,这个参数就是占位参数 由于有类型名 所以 函数调用的时候 必须给占位参数传参。 由于没有形参名 所以 函数内部 是无法使用占位参数。
void test01(int ,int b = 10)
{
}
函数重载:C++的1多台特性
函数重载:同一个函数名在不同场景下可以具有不同的含义。
函数重载意义:方便的使用函数名。
函数重载的条件: 同一个作用域 参数个数不同 参数类型不同 参数顺 序不同(重要)
注:只有上述(个数,类型,顺序)不同时候才能发生函数重载
函数的返回值不能作为重载条件
int test()
{
}
void test()
{
}
编译器会自动报错,提示不能重载返回值类型不同的函数
2、函数重载和默认参数一起使用,需要额外注意二义性问题的产生
void test(int a)
{
}
void test(int a, int b = 10)
{
}
/*调用函数时候如果不向第二个参数传参就不能区分到底调用哪个函数,会造成二义性并且报错*/
概述函数重载实现原理:
编译器为了实现函数重载,也是默认为我们做了一些幕后的工作,编译器用不同的 参数类型来修饰不同的函数名,比如 void func(); 编译器可能会将函数名修饰成 func,当编译器碰到 void func(int x),编译器可能将函数名修饰为 funcint,当编译器 碰到 void func(int x,char c),编译器可能会将函数名修饰为 funcintchar 我这里使用” 可能”这个字眼是因为编译器如何修饰重载的函数名称并没有一个统一的标准,所 以不同的编译器可能会产生不同的内部名。
四,实现c文件和c++文件一起编译:
如果按照常规的写此文件的方式去写c的头文件,会造成c++编译器会把c文件当做c++文件来进行编译并且报错,
解决方法:
#if __cplusplus
extern "C"{
#endif
extern int my_add(int x,int y);
extern int my_sub(int x,int y);
#if __cplusplus
}
#endif
五,c++类的浅述:
封装的概念:
1,把变量(属性)和函数(操作)合成一个整体,封装在一个类中 对变量和函数进行访问控制(公有、私有、保护)
2,在类的内部(作用域范围内),没有访问权限之分,所有成员可以相互访问 3,在类的外部(作用域范围外),访问权限才有意义:public,private,protected 5. 在类的外部,只有 public 修饰的成员才能被访问,在没有涉及继承与派生 时, private 和 protected 是同等级的,外部不允许访问
class Person
{
public:/*对于下面的变量和函数外部是可以访问得到的 */
int t1;
private:
int t2;/*这样的属性是无法被外部访问得到的,如果想要访问则可以向外提供一个接口函数*/
protected:
int t3;
};
/*在类的内部没有权限之分都可以访问的到*/