2.1 基本内置类型
- 基本数据类型包括算术类型和空类型
- 算术类型分为两类:整型(包括字符和布尔类型在内)和浮点型,其中字符是单字节的整数,ASCII字符代表的值是0~127,用unsigned char表示一个不太大的整数。
- 字:储存的基本单元 1字 = 4/8个字节 字节:(byte)是计算机中数据处理的基本单元 1byte = 8bit 比特(bit/位) 表示二进制位,计算机内部数据储存的最小单元,如 1011 是一个4位二进制数字
- 了解类型转换
- 字面值常量就是常量本身,比如 21, “name” 表示类两种类型的字面值。有些类型有多重表示法,比如数字可以用不同进制表示,浮点型可以用科学计数法书写,布尔类型的字面值是true 和 false,指针类型的字面值nullptr
- 后缀没有f,L的小数默认double
2.2 变量
变量是对数据的有名存储,既然有名就可以对改数据做一些操作如赋值修改等等。这里有两个表达式概念先了解一下
左值:左值可以出现在赋值语句的左面或者右面
右值:右值只能出现在赋值语句的右面儿不能出现在左面
变量是左值,常量是右值,字面值常量也是右值
变量定义和初始化值更具类型不用也不同,内置类型不能隐身初始化,类类型一定要可以隐式初始化。
先看内置类型:
int a ; // 没有初始化内容,它的值由系统分配规则是在栈区和堆区(函数内定义或者类里面定义)都取随机值,在全局区(全局常量,静态变量)都是全零值。
int b=1 ; // 这种叫赋值初始化
int c(1),d(b + 2) ; // 这种叫直接初始化()中不一定是常量可以是一个表达式或变量
这两种初始化是不一样,后面讲到类类型时就会明白一般来说直接初始化更灵活且效率更高。
需要特别强调的是未初始化的内置类型虽然也会有值但是其分配规则导致其值不确定性,所以我们定义内置类型时一定要初始化值而不依赖系统的内部非配规则。
再看类类型定义:
string a; // 隐式初始化初始化成了 “”
string b = "name" ;
string c(b) ;
string d(10,'a') ; // string类特有的初始化方法,等同于10个字符a组成字符串并赋值初始化给变量b
类类型的初始化其实就是构造函数, 隐式初始化实际上就调用类型的默认构造函数来初始化类型对象;直接初始化是调用类的拷贝构造函数;而直赋值初始化是调用赋值操作符重载和拷贝构造函数。相关内容再后续章节会有详细说明。
声明和定义
c++是一门奇怪的语言,我们先看如下代码
{
std::cout << v1 << std::endl;
}
int v1 = 1;
绝大部分语言中这样的写法是没有问题的,但在C++中却会编译不通过,因为C++是严格的顺序编译非类对象代码的,当main函数编译时要用到的变量v1还没有执行定义,c++就会抛出异常说使用了未定义的变量v1,如果吧这个 int v1;语句放到函数前面就没问题。那么我们是不是只能这样做呢? 答案当然是否定的,我们可以不改变现在代码顺序而使用声明解决这个编译错误,可以这样修改代码: