1、内联函数 inline
宏函数(带参数)的缺点:
第一个在c中也会出现,宏看起来像一个函数调用,但是会有隐藏一些难以发现的错误。
第二个问题是c++特有的,预处理器不允许访问类的成员,也就是说预处理器宏不能用作类的成员函数
内联函数:内联函数为了继承宏函数的效率,没有函数调用时开销,然后又可以像普通函数那样,可以进行参数,返回值类型的安全检查,又可以作为成员函数
内联函数:是一个真正的函数。函数的替换 发生在编译阶段
inline int my_mul(int x,int y)
{
return x*y;
}
void test01()
{
cout<<"my_mul = "<<my_mul(10+10,20+20)<<endl;
}
1.1任何在类内部定义的函数自动成为内联函数。
class Person{
public:
Person()
{
cout<<"构造函数"<<endl;
}
void PrintPerson()
{
cot<<"输出person"<<endl;
}
};
内联函数的条件:
1、不能存在任何形式的循环语句
2、不能存在过多的条件判断语句
3、函数体不能过于庞大 不能对函数进行取址操作
2、函数的默认(缺省)参数
c++在声明函数原型的时可为一个或者多个参数指定默认(缺省)的参数值,当函数调用的时候如果没有传递该参数值,编译器会自动用默认值代替。
/函数的默认参数 指定x的默认值为10 y为20
int my_add(int x=10,int y=20)
{
return x+y;
}
void test02()
{
//如果函数传参 那么各自的默认参数将无效
cout<<"my_add = "<<my_add(100,200)<<endl;//300
//如果某个参数未被传参 将启用默认值x=100 y使用默认值20
cout<<"my_add = "<<my_add(100)<<endl;//120
//x=10 y=20
cout<<"my_add = "<<my_add()<<endl;//30
}
注意:
1、函数的默认参数从左向右,如果一个参数设置了默认参数,那么这个参数之后的参数都必须设置默认参数
//函数的默认参数从左向右
int func01(int x,int y=20,int z=30)
{
return x+y+z;
}
void test03()
{
cout<<func01(100,200)<<endl;//330
cout<<func01(100)<<endl;//150
//cout<<func01()<<endl;//err x没有设置默认参数 必须传参
}
2、如果函数声明和函数定义分开写,函数声明和函数定义不能同时设置默认参数
建议:函数声明出设置缺省参数
fun.cpp
int func02(int x,int y,int z)
{
return x+y+z;
}
main.cpp
//分文件 函数定义处的默认参数 是无效的
//建议:分文件是 在声明 给默认参数
extern int func02(int x,int y=25,int z=35);
//extern int func02(int x,int y,int z);//err
void test04()
{
cout<<func02(100,200)<<endl;//335
cout<<func02(100)<<endl;//160
}
3函数重载(c++的多态特性)
函数重载:同一个函数名在不同场景下可以具有不同的含义。
函数重载意义:方便的使用函数名。
函数重载的条件: 同一个作用域 参数个数不同 参数类型不同 参数顺序不同(重要)
void myFunc(int a)
{
cout<<"int的myFunc"<<endl;
}
void myFunc(int a,int b)
{
cout<<"int,int 的myFunc"<<endl;
}
void myFunc(int a,double b)
{
cout<<"int , double的myFunc"<<endl;
}
void myFunc(double a,int b)
{
cout<<"double,int的myFunc"<<endl;
}
void test06()
{
myFunc(10);//int
myFunc(10,20);//int int
myFunc(10,20.2);//int double
myFunc(10.1,20);//double int
}
注意:
1、函数的返回值类型不能作为函数重载的依据
2、函数重载和默认参数一起使用,需要注意二义性问题的产生
4类的出识
lass 类名{//抽象的概念 系统不会为其分配空间
private://私有 类的外部 不可直接访问
protected://保护 类的外部 不可直接访问
数据
public://公有 类的外部 可以直接访问
方法
//在类的内部 没有权限之分 都可以相互访问
};
class Person//抽象的概念
{//类的内部
private:
int m_money;//私有数据
protected:
int m_age;
public:
void dese()
{
m_money = 100;
m_age = 18;
cout<<"我有房 有车 又年轻"<<m_age<<"岁又有钱"<<m_money<<"万美金 我就爱嘚瑟"<<endl;
}
};
void test01()
{
//用类 去 实例化 一个对象(就是用Person定义一个变量)
Person lucy;
//cout<<"兄弟你的钱:"<<lucy.m_money<<endl;//err 内的外部不可访问
//cout<<"兄弟你的年龄:"<<lucy.m_age<<endl;//err 内的外部不可访问
lucy.dese();//ok 公有的类的外部可用访问
//private protected虽然是私有、保护的 类外不可访问 但是用户可以借助 public公有的方法
//间接的访问私有、保护的数据
}
class默认是私有的 数据私有 方法公有 用户就可以借助 公有方法 间接的操作 私有数据