静态类型,动态类型与类型推导
静态类型的类型检查发生在编译阶段,而动态类型(使用基类指针调用虚函数)的检查发生在运行阶段。
类型推导,是由C++11引入的在编译阶段对变量类型的自动推导功能,即auto。
auto 基本用法
auto是指示编译器根据变量值推断变量类型的占位符,用来避免复杂的变量初始化声明,如iterator
等。
使用auto
需要注意以下几点:
- 使用
auto
声明的变量必须初始化,因为变量值是auto
进行类型推断的依据。显然,函数和模板参数不可以声明为auto
类型 auto
仅为占位符,所以它不能用于类型转换,sizeof
,typeid
等需要获取变量类型的操作- 对于使用
auto
序列声明的变量,其初始值必须是相同类型,即一个auto
占位符只会被推导为一个类型
Range-like loop
是传统遍历一个范围内的所有值的for循环的一个易读替换,可用于简化通过iterator
操纵容器内元素的循环编写。
C++11标准下的语法:
for(范围声明: 范围表达式) { 循环声明 }
- 范围声明:声明一个作为迭代器的变量,其变量类型与范围表达式返回的容器内的变量类型一致,或者是范围表达式返回的容器内的变量类型的引用,一般使用
auto
来简化 - 范围表达式:一般是一个容器变量或返回一个容器的函数
代码样例:
#include <vector>
int main() {
std::vector<int> v = {0, 1, 2, 3, 4, 5};
for (const int& i : v) // 传const引用
std::cout << i << ' ';
std::cout << '\n';
for (auto i : v) // 传递值
std::cout << i << ' ';
std::cout << '\n';
for (auto&& i : v) // 传递引用
std::cout << i << ' ';
std::cout << '\n';
const auto& cv = v;
for (auto&& i : cv) // 传递const int&的引用
std::cout << i << ' ';
std::cout << '\n';
for (int n : {0, 1, 2, 3, 4, 5}) // 使用花括号初始化的列表
std::cout << n << ' ';
std::cout << '\n';
int a[] = {0, 1, 2, 3, 4, 5};
for (int n : a) // the initializer may be an array
std::cout << n << ' ';
std::cout << '\n';
for ([[maybe_unused]] int n : a)
std::cout << 1 << ' '; // the loop variable need not be used
std::cout << '\n';
}