C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器
① 第一个字符必须是字母或下划线;
② 后跟字母、下划线、或数字;
③ 标识符对大小写敏感;
④ 不能与c++保留字(即关键字)同名;
⑤ 标识符在C++中一般是32字符(根据不同系统对标识符长度的规定不同而改变)
① 块作用域(局部作用域)
② 文件作用域(全局作用域):在函数和类之外说明的标识符具有文件作用域,其作用域从说明点开始,在文件结束处结束。 如果标识符出现在头文件的文件作用域中,则它的作用域扩展到嵌入了这个头文件的程序文件中 ,直到该程序文件结束,例如外部静态变量,外部变量和外部静态变量合称为全局变量或全程变量
③ 函数原型作用域
④ 函数作用域
⑤ 类作用域
常量分为六种:整型常量、实型常量、字符型常量、字符串常量、符号常量(define)、布尔常量
null是java中的写法。C/C++中的空是NULL
长双精度(long double)在GCC中占12字节,在Visual C++中占8字节
符号常量不能被赋值
任何全局变量都只能被定义它的程序文件中的函数访问 // 错误,因为如果函数定义在全局变量之前,则不能访问全局变量
全局变量和静态变量都是会自动初始化为0,堆和栈中的局部变量不会初始化而拥有不可预测的值
全局变量可用于函数之间传递数据
进行初始化即可自动获取初值为0的变量是全局变量和用static修饰的局部变量
已经定义过的全局变量 假如用引用头文件的方式引用,假如有两个cpp以上引用这个头文件就会出现重复定义,用extern引用 只是声明,不会分配内存,不会重复定义,所以用extern
extern只能用来声明已定义的外部变量,而不能用于变量的定义,只要看到extern,就可以判定这是变量声明,而不是定义变量的语句,例如对于int a而言既可以说是定义也可以说是声明
初始化变量的两种方法:
① int a = 0;// 这种写法,就是经典的C的写法,初始化a为零
② int a(0);// 这个是使用了构造函数写法的初始化,相当于定义一个int的对象,其初始化的传给构造函数的值为零
8.寄存器变量
① 寄存器变量只能是局部变量或函数的形式参数(因为寄存器变量属于动态存储方式)
② 寄存器变量只能为int型或char型
③ 寄存器变量不能进行取地址操作(因为寄存器是无地址的)
④ register只是一个建议型关键字(例inline),但即便没有请求成寄存器变量依然不能对他取地址,因为他已经被声明为register了
char a ='\82';把从转义符""开始后面的数字和转义符一起忽略,表示将最后一个字符’2’赋给变量a
\ooo和\xhh称为通用转义字符,其中ooo表示可以用1-3位八进制数表示一个ASCLL字符,hh表示可以用1-2位十六进制数作一个ASCLL字符(注:\9错误,\0xFE错误)
C++里大写TRUE和小写true区别 true是bool型的; TRUE是int(BOOL)型的(C++中无BOOL类型以及大写的TRUE)
![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps385A.tmp.jpg)
int和const int都是int类型
float a,b=&a;//a的类型是float,b的类型是float,&a的类型是float**。 b和&a类型不同不能进行赋值操作
C++声明double变量用小写的double
用到volatile关键字修饰变量的情况:(了解)
① 设备的硬件寄存器(如:状态寄存器),例对硬件寄存器进行操作
② 一个中断服务子程序中会访问到的非自动变量,例外部中断会改变变量
③ 多线程应用中被几个任务共享的变量,例外部任务会改变变量
④ java/C/C++中volatile关键字可以保证并发编程中的可见性和有序性
⑤ 一个参数既可以是const也可以是volatile:一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它
⑥ 优化器在用到volatile变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份
⑦ volatile适用于多线程应用中被几个任务共享的变量
7.浮点型常量的指数形式(科学记数法):以f e/E n格式组成浮点数,其中f可以是整数或小数,E/e表示以10为底的幂,n为指数且必须为整形,f和n不可或缺
对于十进制的浮点数整数和小数部分可以忽略其中之一
八进制开头一定要以数字0开头
null表示没有地址;null可以赋值给引用变量,不能将null赋给基本类型变量
int和char前面都可以加signed和unsigned修饰,如果指定为signed则以补码形式存放
C++的自定义数据类型: 类(class),结构体(struct),枚举(enum),共用体(union),typedef
类型修饰符char,int,long,int,short都可以用unsigned修饰,但float,double,bool不能
如果指定为signed(有符号),则数值以补码形式存放,如果用unsigned,则数值没有符号,全部二进制位都用来表示数据本身
有符号时,存储的最大值为215-1(32767),最小值为—32768;无符号能存储的最大值为216-1(65535),最小为0
c++标准语法中是没有byte类型的,但有相似的类型char
① 自动类型转换(隐式)
特点: 代码不需要进行特殊处理,自动完成
规则: 数据范围从小到大
安全性:安全
② 强制类型转换:
特点:代码需要进行特殊的格式处理,不能自动完成
格式:范围小的类型 范围小的变量名 = (范围小的类型) 原本范围大的数据
安全性:不安全
将一个double型数据赋给float型时,要注意数值范围不能溢出,否则出现溢出错误
1. 三种强制类型转换表达式:
① static_cast
基本类型之间的转换,但不能用于基本类型指针之间的类型转换(void指针和基本类型指针之间可以
用于有继承关系的子类与父类之间的指针或引用的转换
空类型指针转换为任意基本类型的指针
② const_cast
static_cast 不能将 const int* 转成 int*,const_cast 就可以,用法为 const_cast
const_cast<>里边的内容必须是引用或者指针,就连把 int 转成 int 都不行
③ reinterpret_cast
用法为 reinterpret_cast
type-id 必须是一个指针、引用、算术类型、函数针或者成员指针
可改变指针或引用的类型
将指针或引用转换为一个足够长度的整形
将整型转换为指针或引用类型
④ dynamic_cast
前面三种都是编译时完成的,dynamic_cast 是运行时处理的,运行时要进行类型检查
不能用于内置的基本数据类型的强制转换
dynamic_cast 要求 <> 内所描述的目标类型必须为指针或引用。dynamic_cast 转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回 nullptr
在类的转换时,在类层次间进行上行转换(子类指针指向父类指针)时,dynamic_cast 和 static_cast 的效果是一样的。在进行下行转换(父类指针转化为子类指针)时,dynamic_cast 具有类型检查的功能,比 static_cast 更安全
使用 dynamic_cast 进行转换的,基类中一定要有虚函数,否则编译不通过(类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义)
表达式dynamic_cast<T*>(a) 将a值转换为类型为T的对象指针。如果类型T不是a的某个基类型,该操作将返回一个空指针,如果可以,它返回一个新指针,甚至计算出为处理多继承的需要的必要的偏移量;此可以作为对象继承之间的转换
对于使用dynamic_cast进行基类和派生类之间的转换规则:向上转换一定成功,向下转换不一定成功。向下转换必须存在虚函数,不然编译错误
⑥ T(E)
⑦ (T)E
E代表运算表达式,T代表一个类型表达式
上述任一种都可以按自己意愿进行所需的类型强制转换
3. C++的基本数据类型之间的转换规则:char>short>int>unsigned->long->unsigned->long->float->double->long double
整数默认为int,大了会自动扩展到long和long long。 小数默认为double,精度提高会自动扩展到long double
将一个 int,short,long型数据赋给一个char型变量,只能将其低8位原封不动的送到char型变量(发生截断);将浮点型数据赋给整型变量,舍弃其小数部分
将double型数据赋给float变量时,截取前面7位有效数字存储到float变量;将float型数据赋给double变量时,数值不变,有效数字扩展到16位
int和float一定是在整型变量可输出字符的范围内才可以与字符数据互相转换