C++ primer复合类型
主要包括两种:引用和指针。
引用
为对象起来另外的名字,对象没变
可跟着绑定的对象一起变化
注:
1.引用必须被初始化
2.初始值必须是对象,不能是字面值或者表达式结果
int ival = 1024;
int &refVal = ival; //refVal引用了ival ,是ival的另一个名字
int &refVal; //报错 必须初始化
int &refVal = 10; //报错 引用的初始值必须是对象
指针
指向对象的地址,也可实现对其他对象的间接访问。
区别:指针本身是对象,可赋值拷贝;指针定义时无需初值;
定义指针类型: int *p;
解引用符:*
解引用需要对有效指针使用。
不能把变量赋值给指针
符号去歧义:
注:声明阶段:基本数据类型 + 声明符 = int num;
下表的前置程序段:
int ival = 1024;
int *pout =&ival;
符号\位置 | 声明阶段-基本数据类型 | 其他部分 |
---|---|---|
* | 定义指针类型: int *p; | 解引用:count << *pout; (解了指针pout的引用,输出1024) |
& | 定义引用类型:int &refVal = ival; | 获取对象的地址:int *p = &ival; |
指向指针的指针
int ival = 1024;
init *pi = &ival;
int **ppi = π
解引用同样要两次。
处理类型 C++11
auto类型说明符
应用场景:定义的时候不知道声明变量的表达式是啥基本类型
auto让编译器替我们分析表达式所属的类型
auto item = v1+ v2;
decltype类型指示符
应用场景: 希望从表达式推断出要定义的变量类型,但是不想用表达式的值来做变量的初始值。
decltype只是返回操作数的数据类型,编译器只是返回类型,不计算实际值。
int i=5;
decltype(i+6) b;
for循环新写法 : 基于范围的for语句
for (declaration:expression)
statement
expression 序列对象 declaration访问序列中的基础元素。
每次迭代,declaration部分的变量会被初始化为expression部分下一个变量值
结合string:
string str("some string");
for (auto c : str)
cout << c << endl; //每行一个输出str中的字符
Vscode C++11编译支持
打开项目的tasks.json文件(在项目根目录下,可能隐藏)
在args中加入“-std=c++11”
如下图示: