面向对象的嵌入式软件开发(第三周学习记录)
- C++的输入和输出
cin:对象(变量) >> 输入流
cout:对象(变量) << 输出流 [有缓冲区,类型是行缓冲区]
cerr:输出(错误信息) [无缓冲区]
clog:输出(日志信息) [无缓冲区] - 缓冲区
缓冲区:在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区
\n ,endl(刷新缓冲区并加入“\n”)
作用:输出调试中确保输出 - for语句升级
for语句升级:解决循环变量浪费空间的问题
for(int i=0;i<100;i++)
{
}
新类型 bool:提高可读性
bool flag = false;
while(flag == true)
{
}
条件表达式:可以将返回值作为左值:优化
int a = 5;
int b = 6;
int max = a > b ? a : b;
(a > b ? a : b) = 10;
cout << "b = " << b <<endl;
return 0;
- 关键字的升级
关键字:static const register extern typedef inline register - register
功能:将修饰变量尽可能保存到CPU内部寄存中,从而省去从内部抓取数据的时间,从而提高运行效率
注意事项
1、只能修饰局部变量,不能修饰函数和全局变量
2、register修饰的变量不能再用&获取该变量的地址
3、register修饰的变量一定是CPU所接受的数据类型
使用场景:频繁访问的变量
C++升级:如果使用&获取一个register修饰变量的地址,那么就将该变量保存到内存中 - const
功能:修饰变量,该变量为只读变量[不能通过变量名改变]
注意事项:const指针 对 const指针
使用场景:修饰函数形参,保证函数实参在函数执行过程中不被修改
C++升级:const关键词修饰的变量就是常量 - typedef
功能:给数据类型重命名(重命名:提高代码可读性、移植性,提高编程效率)
C++升级:启用信的关键字 using
注意事项:重命名函数指针(函数名:指针常量,保存函数入口地址) - auto
功能:自动变量[在函数结束之后解放空间]
C++升级:做类型推导,高效编程
auto p=5;
auto p1='a';
auto p2="hello world";
auto p_func = add;
return 0;
-
类型升级
-
传值 VS 传地址
传实参变量名,只能使用实参的值,不能修改
传实参变量地址,既能使用也能修改
当需要修改实参变量的值,传实参变量的值
当只使用实参变量的值,传实参变量 -
引用
作用:给变量起别名,操作别名相当于操作这个变量
注意事项:定义必须初始化
使用场景:函数形参,返回值
左值引用:能够赋值(修改),能取地址[只能绑定左值]
右值引用:不能赋值(修改),不能取地址[只能绑定右值]
右值引用[对象移动] -
引用 VS 指针
1、指针是变量,引用时别名,引用解决函数传参传地址选择问题
2、引用指针都占内存(引用编译阶段确立,并非隐藏)
3、指针又多级指针,引用有左值引用和右值引用
4、指针不安全,容易造成内存泄漏,引用不会 -
动态内存分配(new delate)
动态管理内存方式(C++升级):malloc free
区别:
1、malloc/free是函数 new/delate是运算符
2、malloc/free按照字节为单位分配 new/delate按照类型为单位
3、malloc/free不能初始化分配空间 new/delate可初始化
Type *p=new Type[常量];
delete[]p;
用new[]分配的内存需要用delete[]释放。
注意:申请数组空间不能对这一段空间进行初始化。
[扩展1]如何给多维数组分配空间
二维数组的动态创建,例如申请存放二维数组 int a[5][6]的内存空间。
int**a=new int8[5]
for(int i=0;i<5;++i)
{
a[i]=new int[6];
}
使用delete进行内存释放,只要将顺序反过来就行了
for(int i-0;i<5;i++)
{
delete[]a[i];
}
delete[]a;
[扩展2]如何创建三维数组
int***a=new int**[5];
//空间申请
for(int i=0;i<5;++i)
{
a[i]=new int8[6];
for(intj=0;j<6;++j)
{
a[i][j]=new int[7];
}
}
//空间释放
for(int i=0;i<5;++i)
{
for(int j=0;j<6;++j)
{
delete[]a[i][j];
}
delete[]a[i];
}
delete[]a;
- inline
inline:内嵌
作用:以内存空间换运行时间
时间(编译)换空间(内存)
空间(内存)换时间(运行)
宏函数:省去函数传参、返回、释放等一系列操作
自定义函数:形参需要分配空间
inline:内嵌的作用,以内存空间,提高内存效率。(只修饰函数)
内联函数在最终生成的代码中是没有定义的,c++编译器直接将函数体插入在函数调用的地方,内联函数没有普通函数调用时的额外开销(如压栈、跳转、返回)
c++中内联编译的限制:
- 不能存在任何形式的循环语句;
- 不能存在过多的条件判断语句;
- 函数体不能过于庞大;
- 不能对函数进行取址操作;
- 函数内联声明必须在调用语句之前;
引用:给变量起别名
注意:定义必须初始化。
int &r_a=a; √
int &r_a;
&r_a=a; ×
应用:函数形参,返回值。