😀永不放弃是你梦想实现的唯一秘诀 一起加油!!!
目录
内联函数
函数添加inline关键字 该函数为内联函数 本质还是一个函数
inline int getMax(int a,int b) //内联函数
{
return a>b?a:b;
}
void test_01()
{
int a=10,b=20;
cout<<getMax(a,b)<<endl;
}
内联函数的特点
内联函数:在编译阶段 像宏一样展开。有作用域的限制(可以放到命名空间,可以放到结构体和类中)
内联函数为了继承宏的效率,没有函数调用时的开销,然后又可以像普通函数那样,可以进行参数和返回值类型的安全检查,又可以作为成员函数
注意:任何在类内部定义的函数自动成为内联函数。
class A
{
public:
func() //自动转为内联函数
{
}
};
内联的条件:
不能存在任何形式的循环语句
不能存在过多的条件判断语句
函数体不能过于庞大
不能对函数进行取址操作
inline修饰函数 只是建议编译器 该函数为内联函数(由编译器决定)。
取代宏定义
宏函数的使用是在预处理阶段直接代码替换,所以,在使用上可能会出现数据异常;我们需要使用内联函数赖取代宏函数的应用。
#define ADD(x,y) x+y
inline int add(int x,int y)
{
return x+y;
}
void test_01()
{
// int res = ADD(10,20)*10; //期望 300
// cout<<res<<endl; //实际 210 10+20*10;
//使用内联函数就可以避免这种情况
int res = add(10,20)*10;
cout<<res<<endl; //300
}
内联函数和宏定义总结:
内联函数比宏函数安全性更高 有参数类型和返回值类型检测 又可以作为成员函数
重载于默认值
重载(重要)
重载条件:在同一个作用域下 函数名相同 参数个数或类型不同作用 统一功能的使用
例子:
void func(int a)
{
cout<<"一个int值的参数"<<endl;
}
void func(int a,int b)
{
cout<<"两个int值的参数"<<endl;
}
void func(float a,float b)
{
cout<<"两个float值的参数"<<endl;
}
void test_01()
{
int a=0,b=0;
func(a); //一个int值的参数
func(a,b); //两个int值的参数
float c=0,d=0;
func(c,d); //两个float值的参数
}
重载原理:
代码编译时,在系统中存储的为函数名字加一定形式参数集合
例如:
void add(int a,int b) -----> #addII
int sub(float a) -----> #subf
以上案例只是为了便于理解 实际存储方式以手册为准
所以 函数的返回值不同不会够成重载 编译器无法识别返回值不同的函数重载
默认参数
可以给函数的形参添加默认值,函数调用传参时 当参数没有被赋值时 默认使用默认参数
默认参数可以写到函数声明或函数实现中 其一即可 (不可两个都写 一般写到函数的声明中)
int func(int a = 3); //函数声明
void test_01()
{
int ret = func(); //无参调用 函数形参使用默认参数
cout<<ret<<endl; //3
}
int func(int a) //函数定义
{
cout<<a<<endl; //3
return a; //返回默认值
}
当一个参数有默认值后 该参数右边的所有形参必须都有默认值。
参数占位符
占位符:只写类型,不给定变量名;占位符很少用;一般再后面的运算符重载中使用
void func(int) //占位符
{
cout<<"占位符函数"<<endl;
}
void test_01()
{
func(a);
}
参数占位符也可以有默认值 (当给参数占位符默认值后 参数占位符毫无作用)
注意:默认参数和占位参数建议不要在函数重载中使用 容易发生二义性
混合编程
混合编程;在C++的代码中嵌入C的代码; 或者C的代码中嵌入C++代码;需要考虑如何兼容的问题
test.h 代码
#ifndef TEST_H
#define TEST_H
#ifdef __cplusplus //如果为C++代码 则会执行extern
extern "C"{ //嵌入c代码的规则
#endif
int myadd(int a,int b);
int mysub(int a,int b);
#ifdef __cplusplus
}
#endif
#endif // TEST_H
test.c 代码
int myadd(int a,int b)
{
return a+b;
}
int mysub(int a,int b)
{
return a-b;
}
main.cpp 代码
#include "test.h"
void test01()
{
cout<<add(10,5)<<endl;
cout<<sub(10,5)<<endl;
}
面向对象
概述:
面向对象与面向过程思想:
生活案例:
面向过程:只关注完成的结果,不关注是谁完成的;例如:开饭店-老板既是初始又是服务员又是收银员
面向对象:由专业对象完成某件事; 例如:开饭店-招厨师、招服务员、招收银员。
程序案例:
面向过程:从main函数出发,直接执行代码: 例如, int age = 10;
面向对象:从main函数出发,先创建对象,再执行代码: 例如, Person zs; zs.age=10;
类和对象(重点)
面向对象:模拟现实世界,解决现实问题的一种贴近生活化的编程思维。
类:一类事物的抽象化描述(集合) 例如: 人类 水果类 动物类等等
对象:一类事物中的具体化的某个个体 例如:张三 香蕉 猴子
成员属性:描述某个对象的特征,以名词形式出现 例如:张三有姓名,年龄
成员函数:描述某个对象的行为,以动词形式出现 例如:张三能吃
面向对象设计:创建一个类,类中有属性和函数,创建对象,通过对象调属性和函数
案例:张三很能吃 类-学生类 对象-张三 属性-姓名,年龄 函数-吃
#include <cstring>
class Student
{
public: //公共权限
char name[32];
int age;
void func()
{
cout<<name<<"很能吃"<<endl;
}
};
void test_01()
{
Student s;
s.age = 18;
strcpy(s.name,"zansan"); //zansan很能吃
s.func();
}
访问权限:
public :公共权限 在类外类内都可访问
private:私有权限 在类内可访问 类外不可访问
protected:保护权限 在类内可访问 类外不可访问(和权限的区别会在后面课程继承中展示)
封装性(重要):
概述:类成员变量私有化 不允许外界直接访问 通过接口访问
作用:提高安全性和复用性
class Girl
{
private:
int m_Age;
public:
void setAge(int age) //int age = 18
{ //可添加年龄的判断条件
m_Age = age; //注意:成员属性和参数名不能重名
}
int getAge()
{
return m_Age;
}
};
void test_01()
{
Girl xl;
xl.setAge(18);
cout<<xl.getAge()<<endl;
//cout<<xl.m_Age<<endl; //ERROR 为私有属性
}
练习:
请设计一个 Person 类,Person 类具有 name 和 age 属性,提供初始化函数 (Init),并提供对 name 和 age 的读写函数(set,get),但必须确保 age 的赋值在有 效范围内(0-100),超出有效范围,则拒绝赋值,并提供方法输出姓名和年龄.(尽量先自主完成哟)
#include <string.h>
class Person
{
private:
char m_Name[32];
int m_Age;
public:
void setname(char* name)
{
strcpy(m_Name,name);
}
char* getname()
{
return m_Name;
}
void setage(int age)
{
if(age>=0&&age<=100)
{
m_Age = age;
}
else
{
cout<<"输入年龄错误!!!"<<endl;
}
}
int getage()
{
return m_Age;
}
void InitPerson(char* name,int age)
{
strcpy(m_Name,name);
setage(age);
}
void printPerson()
{
cout<<"姓名 :"<<m_Name<<"年龄 :"<<m_Age<<endl;
}
};
void test_01()
{
Person p1;
p1.InitPerson("zhangsan",18);
p1.printPerson();
Person p2;
p2.setname("lisi");
p2.setage(20);
cout<<"姓名 :"<<p2.getname()<<" 年龄 : "<<p2.getage()<<endl;
}
进阶练习可以去牛客网啦
建议收藏 c++连载(入门到精通)🌹🌹🌹