IE盒子

搜索
查看: 108|回复: 0

C++的基本内置类型和变量

[复制链接]

4

主题

7

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2023-4-23 14:20:53 | 显示全部楼层 |阅读模式
1. 算术类型



算术类型的尺寸在不同机器上有所差别
允许编译器设置更大的尺寸,但是要保证short <= int <= long <= long long
在以上类型前加上unsigned得到无符号版本,在以上类型前加上signed得到有符号版本
需要注意的是,单独使用unsigned代表unsigned int
1.1 类型转换

从bool变量转换成其它算术类型变量时,true转换成1,false转换成0
从其它算术类型变量转换成bool变量时,非0值转换成true,0转换成false
ps:从指针转换成bool变量时,非0值转换成true,0转换成false
当给一个变量赋上一个超出它所能表示范围的值时,将会发生数据溢出。例如,8bit的无符号类型 赋上 -1,结果得到 255
1.2 字面值

又叫字面值常量(literal)
1.2.1 整型字面值



无符号数的类型为unsigned int、unsigned long、unsigned long long中能表示字面值的尺寸最小的那个
十进制字面值不会是负数,例如-42的字面值其实是42
short类型没有字面值
1.2.2 浮点字面值

浮点数字面值的默认类型是double

  • 浮点数字面值的例子

    • 3.14
    • 3.14E1
    • 1.
    • - 0e0
    • - .001

1.2.3 字符字面值

字符字面值使用单引号来定义,例如'a'
1.2.4 字符串字面值

字符串字面值使用双引号来定义,例如"ab" 。需要注意的是,结尾处隐含了一个空字符'\0'。也就是说,字符串字面值的长度总是比内容多一个单位
如果两个字符串字面值之间只有空格、缩进、换行符,则可以将它们看成一个字符串,例如
"string1" "string2" 等价于 "string1string2"

"string1"    "string2" 等价于 "string1string2"

"string1"
"string2" 等价于 "string1string2"
转义字符

字符(特别是不可打印的字符)的另一种表示形式


  • C++中的转义字符有:

    • \n:换行符
    • \t:横向制表符
    • \a:报警(响铃)符
    • \v:纵向制表符
    • \b:退格符
    • \":双引号
    • \\:反斜线
    • \?:问好
    • \':单引号
    • \r:回车符
    • \f:进纸符

  • 可以用以下两种形式来表示转义字符

    • \x无限个十六进制数
    • \1到3个八进制数

  • 后面的数字是ASCII编码
1.2.5 指定字面值的类型



2. 变量

2.1 变量定义

类型修饰符&和*只从属于某个变量
int a, *b;    //a的类型为int,b的类型为int指针
初始化和赋值都使用=来完成,但是这是两个不同的概念。初始化的含义是在创建变量时使用=赋上一个初始值。赋值的含义是将已创建好的变量中的值擦除,赋上一个新的值。
int i = 1;    //初始化
i = 2;        //赋值
2.1.1 列表初始化

使用{}来进行初始化的形式称为列表初始化
对内置类型进行列表初始化时,如果初始化存在丢失信息(例如小数部分丢失)的风险,则编译器会报错
对内置数组或标准库容器(除了array)进行列表初始化时,如果没有显式给出长度,那么编译器将会根据列表中元素的数量来推断出长度
2.1.2 默认初始化


  • 当出现以下情况时,将会触发默认初始化:

    • 在任意函数体之外的地方定内置类型变量但是不给初始值时,变量会被默认初始化为0
    • 执行合成默认构造函数时,类类型成员被默认初始化
    • 执行自定义的构造函数时,如果类类型成员没有在构造函数初始化列表中显式初始化,那么该类类型成员被默认初始化

类类型变量需要使用默认构造函数进行默认初始化。如果在需要进行默认初始化的时候无法提供默认构造函数,将会编译报错。当用户希望类类型变量进行默认初始化时,容易犯以下错误。
People obj1();    //错误:obj1是个函数
People obj2;      //正确:obj2是个对象,被默认初始化有一点需要特别注意,当用户在块作用域中定义内置类型变量,但不给初始值时,该变量不会被初始化,因此变量的值是未定义的。而且编译器不一定会给出错误提示,有些编译器会提示错误,有些编译器则不会。所以建议手动初始化每一个内置类型的变量。
2.1.3 值初始化


  • 当出现以下情况时,将会触发值初始化

    • 定义数组时提供的初始值数量小于数组大小时,没有对应初始值的元素被值初始化
    • 定义局部静态变量,但不给初始值
    • 通过Type varName = Type()显式进行值初始化

内置类型变量值初始化为0
类类型变量通过默认构造函数进行值初始化
2.2 变量声明和定义的关系

C++支持分离式编译(separate compilation),声明和定义可以分开进行。
一个变量只能被定义一次,但可以被声明多次
声明的作用式让编译器直到可以在某个源文件中链接到定义,需要注意的是,绝对不会去头文件链接定义。
声明一个变量需要使用extern关键字,且不能初始化例如
//test1.h
extern int i;     //声明

//main.cpp
int i = 1;        //定义

//在需要访问全局变量i的地方include头文件test1.h即可一般约定用户自定义的标识符前缀不可以是__、_紧接大写字母,函数体外的标识符前缀不可以是_
变量在不同作用域中用不同的方式进行访问。一般一个{}确定一个作用域。最外层的作用域是全局作用域 ,通过::名字来访问其中的内容。块作用域通过 块作用域名字::名字 来访问内容。作用域可以嵌套。
3. 复合类型

所谓的复合类型指的是基于其他类型的类型,简单点说就是引用类型和指针类型
一般我们提到的引用指的是左值引用。左值引用其实只是一个已存在变量的另一个名字,我们说当前这个左值引用绑定了一个已存在变量。一个左值引用只能在定义时被绑定,之后再也无法改变绑定的目标变量,所以在定义左值引用变量时必须初始化。左值引用只能绑定到变量上,无法绑定到字面值或表达式的计算结果上
指针变量存储着指向特定类型变量的地址。指针不必在定义时初始化,所以可以为空。可以通过nullptr、NULL显式地初始化或赋值为空指针。nullptr是一种特殊类型的字面值。NULL是一个预处理变量,其实就是字面值0。注意,虽然地址可以看成一个整型数字,但是不能给指针赋上整型值,只能赋上通过取址赋得到的值。特别建议对所有的指针进行初始化,访问未初始化的指针会对内存中的造成恶性破坏。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表