您的位置:首页 > 编程语言 > C语言/C++

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

2016-08-14 16:01 393 查看

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*)
a(a为上面那个a),强转,语法上无措,即所指地址的接下来1个字节会被解释称char变量。换句话说【内存中存储的东西都是一样的,类型是编译器对那部分内存的一个解释】。

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

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

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

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

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

d) this指针

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

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

iii. 不占对象大小:因为是一个参数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: