变量+复合类型
一. 变量
1. 初始值
对象:具有某种数据类型的内存空间
建议初始化每一个内置类型的变量
1.1 初始化与赋值的区别
初始化与赋值是完全不同的操作
初始化:创造变量时,赋予其一个初始值
赋值:把对象当前值擦除,而以一个全新的值代替
1.2 初始化“四大”家
int a = 0;
int a(0);
//列表初始化
int a = {0};
int a{0};
c++11新标准:用花括号{ }初始值(又叫:列表初始化)的变量得到全面应用
1.3 初始化的注意事项
如果在内置类型(比如int,double型)的变量,并且会出现丢失信息的风险时,若我们使用列表初始化,编译器会自动报错。
例如:
long double pi = 3.142312471849;
int a = {pi} , b{pi}; //报错
int m = pi, n(pi); //正确
a b会报错 是因为 int 型 与 long double 型 会出现信息丢失。
2. 初识 - 关键字extern
2.1 声明与定义的区别
把 建立空间 的声明称为 “定义”
把 不需要建立存储空间 的称为 “声明”
【定义】需要 建立存储空间(int i)
【声明】不需要 建立存储空间 (extern int i)
书本定义:
定义 是包含任何显式初始化的声明(一看便知的初始化)
如果声明有初始化式,就被当作定义,即使前面加了extern
extern int i; //声明未定义
int j; //声明且定义
extern int k = 1; //定义(不再是声明)
如果声明有初始化式,就被当作定义,即使前面加了extern
以下转载的是俩个其他同行对声明与定义的理解:
【注意】
变量只能定义一次,但是可以多次声明
3.标识符
3.1 定义
标识符由字母,数字,下划线组成,必须以字母或者下划线开头
对大小写敏感
例如:
int some;
int Some;
init SOME;
3.2 自定义类名
自定义类名以 大写开头
如:Sales_item
由多个单词组成的必须有明显的区分
3.3 c++关键词
3.4 作用域
3.4.1 定义
main内: 块作用域
main外: 全局作用域
在对象第一次使用的时候,再定义它
3.4.2 作用域操作符( ::)
当作用域操作符左侧为空的时候,即向全局作用域发出请求,获取作用域操作符右侧对应的变量
#include<iostream>
int a = 40;
int main( )
{
int a = 0;
std::cout << :: a << std::endl; //输出40
std::cout << a << std::endl; //输出0
return 0;
}
二. 复合类型
一条声明语句由一个基本数据类型和紧随其后的一个声明符列表组成
1. 引用
1.1 引用定义
为对象起了另一个名字
int ival = 1024;
int &refval = ival; //refval指向ival(是ival的 另一个名字)
int &refval; // 报错!引用必须初始化
引用必须初始化
【理由】无法令引用重新绑定到另一个对象
1.2 一般初始化与引用初始化
一般初始化:初始值会被拷贝到新建的对象中
引用初始化: 引用与初始值直接绑定在一起
1.3 引用使用法
为引用赋值,实际上就是把值赋予引用绑定的对象
引用标识符必须以 & 开头
引用只能绑定到对象上,而不能与字面值或者某个表达式的计算结果绑定在一起
引用也必须是同一类型的引用
int &a = 10; //错误: 不能与计算结果绑定
int a1 = 10;
double &b = a1; //类型不对, 必须是double型
2. 指针
2.1 基本定义
定义指针类型的方法:将声明符写成 *d 的形式 【d为变量名】
指针存放的是对象的地址 ,若想获取该地址,要使用的“取地址符”操作符 &
int ival = 42;
int *p = &ival; //将ival的地址存放在p中
【注意】指向的类型必相同
2.2 指针值
指针的值应属于下列 4种状态 之中:
1 . 指向一个对象
2 . 指向紧邻对象所占空间的下一位置
3 . 空指针
4 . 无效指针
2.3 空指针
int *p1 = nullptr; //最好的使用
int *p2 = 0;
int *p3 = NULL; //预处理变量(必须使用: cstdlib 头文件)
预处理不属于命名空间 std
开始的时候 都需要 将指针初始化 为 0 或者 nullptr
3. void* - 特殊指针
void* 是一种特殊的指针类型,用于存放任意对象的地址
- 拿它和别的指针比较
- 作用函数的输入输出
- 赋给另一个void* 指针
但是void* 不可以直接指向某个对象
【理由】并不知道这个对象是什么类型
4. 运算符*的使用
int *p1, p2;//p1是指针,p2是int型
int* p1, p2;//p1是指针(合法但是容易误解),p2是int型
int *p1, *p2;//p1,p2都是指针
int* p1, p2 ;
p1是指针(合法但是容易误解) ,p2是int型