Skip to content

变量和基本类型

约 802 个字 16 行代码 预计阅读时间 4 分钟

1.基本内置类型

  • 算数类型和空类型
  • bool, char, wchar_t, char16_t, char32_t, short, int, long, long long, fliat, double, long double
  • w_char_t确保可以存放机器最大扩展字符集中的任意一个字符
  • char16_t,char32_t为Unicode字符集服务
  • 一般float 32bit,double 64bit,long double 96/128bit

带符号类型和无符号类型

  • int, short, long, long long前直接加unsigned
  • signed char和unsigned char;char表现为上述两种之一

如何选择类型

  • 数值不为负时,选用无符号类型
  • int执行整数运算;如果超过int,使用long long
  • 算术表达式中不要使用char和bool,char可能有符号;明确指明signed char或unsigned char
  • 浮点数运算选用double类型

类型转换

  • 含有无符号变量时要十分注意,有符号变量会自动地转换成无符号数
  • 前缀(字符)和后缀(整数或浮点数)

2.变量

  • initializer_list<string>:允许进行列表初始化
C++
struct myclass {
  myclass (int,int);
  myclass (initializer_list<int>);
};

myclass foo {10,20};  // calls initializer_list ctor
myclass bar (10,20);

初始值

  • 初始化不是赋值,只是创建对象是赋一个初始值;赋值是将当前值擦除,用一个新值代替
  • 使用花括号进行列表初始化,存在丢失信息的风险,编译器报错

复合类型

引用

  • 引用必须被初始化;指向变量(是变量的另一个名字)
  • 将引用和初始值绑定(bind)在一起

指针

  • 空指针:nullptr, 0, NULL(预处理变量,值就是0)
  • 不能把int变量直接赋给指针,即使是0也不行
  • int *&r;从右向左理解r的定义,是一个引用,引用的对象是一个指针
  • (void*)obj:类似返回p->next

const修饰符

  • 用一个对象去初始化另一个对象,是不是const都无关紧要
  • 默认情况下,const对象仅在文件中有效
  • 如果想在多个文件之间共享const对象,使用extern
C++
double dval = 3.14;
const int &ri = dval;

// 编译器将ri绑定在一个临时对象上
const int tmp = dval;
const int &ri = tmp;
  • 对const的引用可能引用一个并非const的对象

  • 常量指针必须初始化(int* const p = &ri;),初始化后不能被赋值;常量必须初始化(const int i = 3;)

顶层const

  • 顶层const表示指针本身是个常量,底层const表示指针所指的对象是一个常量
  • 执行对象的拷贝操作时,如果是顶层const,不受影响

constexpr和常量表达式

  • constexpr编译器验证变量的值是否是一个常量表达式

处理类型

auto

  • 只保留底层const,忽略顶层const
C++
const auto f = ci;
auto &g = ci;
const auto &j = 32;

decltype

  • 编译器分析表达式得到类型,但不计算表达式的值
  • 返回该变量的类型(包括顶层const和引用)
  • 表达式内容是解引用操作,返回的是引用类型
  • 如果给变量加上多层括号,会得到引用类型

auto与decltype区别

  • auto计算变量的初始值来推断类型;decltype分析表达式但不计算实际表达式的值
  • auto类型和初始值不完全一致,
  • decltype的结果类型和表达式形式密切相关,