文章目录:
  1. 变量类型
  2. 自动变量类型
      1. Auto类型
      2. decltype
  3. 引用
      1. 左值引用和右值引用
      2. 左值引用
      3. 右值引用
  4. 指针
      1. const指针
      2. 指针和类型推导
      3. void指针
  5. 命名空间
暑假预习的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同类型(引用类型保持不变)

引用

左值引用和右值引用

左值引用

为已创建的对象取一个别名,只将别名绑定到所引用的对象,对象的内容不会复制给引用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为左值引用

指针

存储变量的内存地址进行访问。

取址符:&,解引用符:*

image.png

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指针赋值给别的变量的时候需要先进行类型转换。

image.png

引用的行为实际上类似于const 指针的行为,可以把引用看作是支持自动解引用操作的
const 指针,所以所有能用引用的地方最好不要用指针。

命名空间