面向对象的嵌入式学习总结(3)

C++的输入和输出:
cin:对象(变量) >> 输入流
cout:对象(变量) << 输出流
cerr:输出(错误信息)
clog:输出日志信息,没有缓冲区。

cout vs cerr

  1. 输出正常打印信息用cout;异常信息用cerr;
  2. cout是有缓冲区的,类型是行缓冲;cerr没有缓冲。

for语句的升级:解决循环变量浪费时间。

关键字的升级:
C语言中的:static、const、register、extern、typedef、inline;
register: 将修饰变量,尽可能的保存到cpu内部寄存中; 从而省去了从内存抓取数据的时间, 提高程序运行效率。

C++:register关键字的升级:如果使用&获取一个register修饰的变量的地址,那么就将该变量保存到内存中。

1.使用注意事项 :①只能修饰局部变量 不能修饰函数和全局变量 ;②修饰的变量不能再用&获取该变量的地址 ;③register修饰的变量一定是cpu所接受数据类型。

2.使用场景 :频繁访问的变量 。

3.注意 :凡是在类内实现的方法 编译器会尽可能优化成inline函数 ;方法函数尽量类外实现 。

4.编码规范 :
.h文件定义类;
.cpp文件实现类的成员函数 ;

C++中的bool类型
C++在C语言的基本类型系统之上增加了bool
C++中的bool可取的值只有true和false
理论上bool只占用一个字节,
如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现

true代表真值,编译器内部用1来表示
false代表非真值,编译器内部用0来表示

bool类型只有true(非0)和false(0)两个值
C++编译器会在赋值时将非0值转换为true,0值转换为false

#include <stdio.h>
 
int main()
{
    bool b = true;
    printf ("%d, %d\n", b, sizeof(b));
 
    int a = 10;
    b = 3;
    a = b;
    printf ("a = %d, b = %d\n", a, b);
 
    b = -5;
    a = b;
    printf ("a = %d, b = %d\n", a, b);
 
    b = 0;
    a = b;
    printf ("a = %d, b = %d\n", a, b);
 
    b++;
    printf ("a = %d, b = %d\n", a, b);
 
    b += 1;
    printf ("a = %d, b = %d\n", a, b);
    return 0;
}
  1. typedef关键字的升级:启用新的关键字using;
    typedef:给数据类型重命名; 提高代码可读性 ,移植性, 编程效率;

  2. auto关键字
    C语言auto关键字 :自动变量(所在函数结束之后释放空间)
    C++:类型推导; 高效编程 ;

  3. C++:static :修饰成员变量 ,修饰成员方法;
    语法作用 :①修饰的成员叫类成员变量,属于类 ,被这个类的所有对象共享 ;可以使用类名::名字访问 ;
    使用注意事项 :static修饰的成员必须在类外初始化;
    ②static修饰方法 ,该方法属于类 不属于对象, 没有this,只能访问static修饰的成员 ,不能访问非static修饰的成员;可以通过类名::函数名访问;
    工程应用 :static修饰成员作用 :实现对象通信 ;
    static修饰方法 :为了兼容C/C+T混合编程的 ;

  4. C++:const:修饰成员变量, 修饰方法, 修饰对象;
    ①修饰的对象必须在初始化列表初始化 ;
    ②修饰成员方法, 该成员方法只能使用成员变量的值,不能修改 ;但加mutable就可以修改 ;
    mutable告诉编译器 该成员可以在const方法中修改 ;
    ③const修饰的对象只能调用const成员方法;
    注意事项 :const指针对const指针 ;
    应用场景 :修改函数形参:保证函数实参在函数执行过程中不被修改 ;

#include <stdio.h>

int main()
{

const int a= 10;
int*p= (int *)&a;
*p= 20;

printf("&a= %p, p = %p\n", &a, p);
printf("a= %d, *p= %d\n",a, *p);

return 0;
}
运行结果为:

&a = 00EFFB50, p 00EFFB50

a=10,*p= 20

引用 :给变量起别名,操作别名就相当于操作这个变量 ;
注意 :定义必须初始化 ;
引用的使用场景:函数形参,返回值:他说调用可以作为左值 。

传值 VS 传地址:
①传实参变量名,只能使用实参的值 ,不能修改;
②传实参变量的地址 ,即能使用也能修改 ;
③都需要修改实参变量的值, 传实参变量的地址 ;
④当只使用是实参变量的值,传实参变量 。

#include <iostream>
using namespace std;
{
//值传递
void swap1(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
//地址传递
void swap2(int *pa, int *pb)
{
int tmp = *pa;
*pa = *pb;
*pb = tmp;
}
//引用传递
void swap3(int &a, int &b)
{
int tmp = a;
a=b;
b = tmp;
}
int main()
{
int numl = 10;
int num2 = 20;
swapl(numl, num2);
printf ("num1 = %d, num2 = %d\n", num1, num2);

swap2(&numl, &num2);
printf ("numl = %d, num2 = %d\n", numl, num2);

swap3(numl, num2);
prinf ("numl = %od, num2 = %dIn", numl, 
num2);return 0;
}
运行结果为:

numl = 10, num2 = 20
numl = 20, num2 = 10
numl = 10, num2 = 20
上一篇:计算机基础知识手写笔记(202109)


下一篇:npm修改仓库地址