目录
2.1 C++的数据类型
这个地方贴一个图,见P63
2.2 C++中的布尔类型
C++中将不二类型视为只能在0和1当中取值的整数类型。也就是要么是0要么是1;
#include <iostream>
using namespace std;
int main()
{
bool bvar;
int i =5, j = 5;
bvar = i==j;
cout << bvar <<endl;
cout << bvar+i << endl;
}
程序执行结果:
1
6
2.3 void的用法
- 修饰函数返回值,意味着没有返回值
- 修饰函数形参,意味着没有形参
- 修饰指针,也就是void *p; 一般用作两个指针类型的中间转换站,用于指针类型转换。
2.4 枚举类型的定义和使用
用处:主要是提高程序的可读性,本质上就是把一些int类型,起了一个有意思的名字。
语法:
enum weekDay{Sun = -1, Mon, Tue};
weekDay day;
day = Tue;
2.5 结构和联合体
结构和类最大的不同是,结构成员变量默认权限是public,而类默认是private
其他注意事项:添加图片P73
联合体:最大的特点就是几个数据内存共享;用处比较少pass
2.6 数据类型转换
用法:
(T)expression // C-style cast
T(expression) //function-style cast - c++ style
本质:实质上都是背后类型转换函数的调用,有点像python的魔法函数
转换方式:
- C方式强制类型转换,最不推荐;基本类型中高精度到低精度有精度丢失;复杂类型强制转换可能会有问题
- const_cast:将const类型,临时转换为可以编辑的同样的去掉const的类型。允许临时更改
- staic_cast: 会对类型转换做一些检查;常用语基本数据类型之间的转换; 基类对象指针和派生类对象指针之间的转换;一般的指针和void *之间的转换
- reinterpret_cast: 类似强制类型转换
- 自定义转换函数:
- 比如在两个用户定义类之间转换,或者涉及到的用户自定义类型转换。 比如在类A和基本类型B之间的转换,一般都是通过构造形参为类型B的构造函数来实现;具体见p79
- 类对象转换为基本类型:需要用到自定义的转换函数。类似格式operator int() {return 1;}; 作为类成员函数,权限为Public, 没有形参,也没有返回值,必须要有目标类型的返回语句。详情见P83
- 2 - 4 统一用法: type_cast_operator<type>(expression)
2.7 声明与定义的区别
声明:就是告诉编译器,我这个标识在哪个地方可以用,有可能使用;但是如果后续代码里面没有调用,那对应的这个声明可以没有定义。
定义:也就是声明所对应的代码原型实现的具体内容。
- 基本类型 变量的声明和定义是一致的; 此处添加图片p84
- 函数的声明就是函数原型;而函数定义是函数实现
- 构造数据类型,比如类,结构体,联合体。声明 可以是 class A; A对应的定义是列出A所有全部成员的地方,注意在类的定义 中 所有数据成员的说明语句都是声明,而不是定义。所以不能在类体直接为数据成员赋初值,而是要通过构造函数赋值。
2.8 初始化
初始化就是创建一个变量,并使其具有意义的过程。包含两个方面,一个是分配空间,另一个是给对应空间写入特定的初始值。
变量定义一定要跟随赋初值,因为不同编译器给于的初值不一样,有可能引发错误。
指针变量在使用前,一定要给予有意义的值,不允许野指针。
类的初始化和赋值不一样,一个调用的是构造函数,另一个调用的是赋值函数,也就是operator = () 魔法函数。
malloc使用的时候,只会申请空间,不会初始化
new调用的时候,除了申请空间,还会初始化
2.9 作用域和生命期
两个概念一个是空间上的,一个是时间上的。
作用域:就是告诉编译器,这个变量在什么范围可以使用。一般都是在变量声明之后可以使用
声明域:就是声明标识符的区域,比如全局变量的声明,声明域是整个文件。函数内声明的局部变量,是整个函数体或者复合语句。
潜在作用域:从声明点开始,到声明域的结束。
作用域:也就是标识符对程序可见的范围,之所以和潜在作用域不同,主要是考虑到在嵌套作用域中存在同名变量的时候,会形成隐藏的现象。
详情可以见P92
生命期:就是程序从运行到结束这一段过程中,某变量存在的时间段。
2.10 头文件
用途:头文件主要用于抽出程序中一些common的东西出来,可以减少冗余代码。主要是相同的数据结构。
在编译的时候,可以认为就是把头文件的内容直接铺在cpp文件中。
2.11 分离编译模式
实际上就是:声明和定义的分离。也就是说想用的时候,只要在某个文件中做声明,这时候假设定义已经在其他地方实现了。在编译的时候每个文件单独编译一个目标文件。然后链接起来。