c++ base-基本语法【暂】

    xiaoxiao2025-04-19  10

    1.宏定义和展开

    主要是带参数的宏替换,要注意括号

    a) 宏定义

    简单的宏定义

    #define PI 3.1415926

    带参数的宏定义

    #define A(x) x*x  A(x)处展开x*x

    b) 宏定义优点

    i. 【方便程序的修改

    ii. 【提高程序的运行效率】(带参数的宏定义可以替换简单的函数。相较于函数而言,宏定义直接在程序中展开,无需像函数调用那般需要保存现场和恢复现场)

    c) 宏展开(预处理,将宏展开的过程就称为宏展开)

    i. 首先用实参替换形参,将实参带入宏文本中

    ii. 然后如果实参也是宏,则展开实参

    iii. 最后再继续处理宏替换后的宏文本,若宏文本也包含宏则继续展开,否则完成展开

    iv. 特例:第一步后,将实参带入宏文本后,实参之前如果遇到字符”#”(给后面的字符加双引号)与”##”(表示连接),即使实参是宏,也不再展开实参,而是当作文本处理

    2.Const

    a) const常量

    i. Const常量和宏常量#define的区别Const常量会进行类型安全检查,#define只是字符替换

    ii. Const int*a】与int*const a】的辨析*const a是指指针a本身是常量,a所指的地址不可变,但地址里的内容可变。而const int *a是指指针a指的东西是常量

    iii. const常量定义时必须初始化

    b) 类成员const

    i. 类成员变量是const,不能在定义时初始化(出static变量外)那么就在初始化列表中初始化

    ii. 类成员函数是const,那么函数中的数据就不允许修改,但mutable修饰成员变量可以在const类成员函数中改变该成员变量

    iii. Const成员函数不能调用非const函数,万一非const函数里面改变变量呢···

    3.extern

    a) extern用于在头文件中声明本模块中可被其他模块使用的函数或变量

    b) extern c{ }表示被修饰内容按C语言方式编译和链接,c++支持函数重载,c语言不支持函数重载,所以函数被编译后在库中名字与c语言格式不同

    4.Sizeof

    a) 指针大小:指针存储的是一个地址,对于32位操作系统,地址大小是固定的4B

    b) 数组大小:char str []的大小等于字符数+1‘\0’)。Char str[100]那就是100B

    c) 类大小:

    i. 空类 大小1B

    ii. Static成员存放在全局静态存储区不占类大小

    iii. 成员函数不占类大小

    iv. 类虚函数有虚表,需要虚表指针,虚表指针占4

    v. 继承时子类大小=子类现有大小+父类大小。C++对象模型:子类对象=从父类对象+子类自己的成员大小

    vi. 成员变量,字节对齐。长度一定是最长元素的整数倍,如果最长元素超过处理器位数,那么以处理器位数对齐

    5.内联函数

    a) inline void foo(){}Inline打头的函数,编译的时候直接嵌入到目标代码中。

    b) 与宏相比较,内联函数会进行类型检查更为安全;与普通函数调用比较,内联函数无需保存调用时的环境变量,所以相对较快。但内联函数是以代码膨胀(代码在调用处复制展开,这样代码总量会增加,执行时内存正文段的指令部分会变大)为代价的,仅仅省去了函数调用的代价,从而提高函数执行的效率。

    c) 以下情况不适用内联函数

    i. 【代码过长】。内联函数是直接插入展开的,会导致代码总量增加,代码过长,多次使用后会导致内存消耗过大。

    ii. 有while等【循环语句】。跟while这些循环相比,环境变量的保存损耗微乎其微

    6.指针与引用

    a) 指针与引用的区别

    i. 非空区别:【指针可以为空】,【引用不能为空】(定义时必须初始化)

    ii. 可修改区别:【指针指向可以被修改】,【引用不能被修改】

    iii. 合法性区别:因为引用不能为空,所以使用时无需合法性检测;指针可以为空,所以使用时需要合法性检测

    iv. 应用选择:就看需不需要修改指向,能不能为空

    b) 指针类型的含义:int *a=&b是指a所指地址的接下来4个字节的地址将会被解释成int变量。(char*) aa为上面那个a),强转,语法上无措,即所指地址的接下来1个字节会被解释称char变量。换句话说【内存中存储的东西都是一样的,类型是编译器对那部分内存的一个解释】。

    c) 函数指针,指针数组、数组指针、迷途指针

    i. 函数指针: 返回类型+函数名+参数列表void (*f) (int,int)

    ii. 指针数组:int *ptr[10],这是一个数组,数组里面全是指针

    iii. 数组指针:int (*ptr)[10],这是一个指针,指向大小为10int数组

    iv. 迷途指针:delete释放内存之后,没有置空或者重新赋值,就又调用的指针。正确的做法是先delete,再指针置空。

    d) this指针

    i. 概念:this指针是所有类成员函数(非静态)的一个隐藏参数,是一个参数!所以【this指针只能在成员函数中使用】,全局函数和静态函数都不能使用this指针

    ii. 生命周期:因为是一个参数,所以在成员函数执行前构造,在成员函数结束后清除

    iii. 不占对象大小:因为是一个参数

    转载请注明原文地址: https://ju.6miu.com/read-1298232.html
    最新回复(0)