暑假预习的C++,突然发现有笔记,然后就发现我就学了一点就没学了,主要内容为C++的变量类型、命名空间和类,主要学习与C不同的内容,更多为了写算法。
变量类型
自动变量类型
Auto类型
auto 是C++11引入的一个关键字,用来自动推断变量的类型。也就是说,你声明变量时,不用显式写出类型,编译器会根据初始化表达式自动推断变量的类型。
int a = 2;
auto b = a;//b的数据类型也是int
const int a = 2;
auto b = a;//b的数据类型的const int
auto a;//错误,必须有初始化定义也可以用来写函数的返回类型。
auto 可以推断出const类型和指针,但是无法推出引用类型。
decltype
decltype 是 C++11 引入的关键字,用来获取表达式的类型,也就是说,编译器会根据括号里的表达式推断出该表达式的准确类型,并把这个类型当作结果返回。decltype(expr) 是得到表达式本身的类型,更准确,包括const和引用性质都保留。
int x = 0;
decltype(x) a; // a的类型是int,与x相同
decltype(x) b = x; // b也是int
const int y = 10;
decltype(y) c = y; // c类型是const int
int& ref = x;
decltype(ref) d = x; // d是int&,和ref同类型(引用类型保持不变)引用
左值引用和右值引用
左值(lvalue):表示有名字的、可寻址的对象。简单来说,就是你可以取地址的变量,表示的是内存中的一个持久位置。
例如:变量
int a;中的a是左值。右值(rvalue):通常是临时对象,没有持久的内存地址,只能用一次。
例如:字面值常量
42、表达式a + b的结果都是右值。
左值引用
为已创建的对象取一个别名,只将别名绑定到所引用的对象,对象的内容不会复制给引用l
int counter = 0;
int &a = counter;
int &b = counter;//错误,因为必须要和一个变量绑定
a = 2;//此时a = counter = 2;const类型的引用无法修改其引用对象的内容,只能进行读操作。
auto类型无法推导出引用,但可以保留const属性。如下:
int i = 0, &u = i;
auto r = ri;//此时auto被推导为int类型右值引用
绑定到右值上的引用,通过&&来定义。程序员可以操纵右值对象,尤其是临时对象,可以通过右值引用获取即将消亡的右值对象的资源。
int i=0;
int &&rr1 = i+1;//正确,绑定到一个临时对象
int &&r2 = i;//错误,i是左值对象通用引用:右值引用声明&& 与类型推导结合,变成一种通用引用类型,可与右值或左值绑定:
int i=0;
auto &&rr1 = 10;//rr1为右值引用
auto &&rr2 = i;//rr2为左值引用指针
存储变量的内存地址进行访问。
取址符:&,解引用符:*
const指针
可以用const int*指向const int类型的变量,但是不能改变值,不过可以改变指针指向的变量。
也可以指向非const类型的变量,原因是指针本身“承诺”不通过它修改指向的内容,所以允许它指向int(非const)的变量,所以不可以直接使用指针改变变量的值。、
“const指针”:不允许改变指针指向的指针,语法类似如下:
int *const ptr = a;
ptr = &b;//错误,const指针不允许改变变量指向指针和类型推导
符号&和*从属于对象名,并不是类型名的一部分,auto 只是一个“占位符”。同一条语句中定义多个对象时,对象类型必须一致,例如:
int i(0);
auto &ref = i, *ptr = &i;//正确,因为类型一致
auto &ref2 = i, ptr2 = &i; //错误:auto 的推导类型不一致
// ref2: auto被推导为int;
// ptr2: auto被推导为int *void指针
void类型的指针可以指向任何类型的变量(也就是地址),但是把void指针赋值给别的变量的时候需要先进行类型转换。
引用的行为实际上类似于const 指针的行为,可以把引用看作是支持自动解引用操作的
const 指针,所以所有能用引用的地方最好不要用指针。





