目录
1. auto
auto的使用限制
- auto变量在定义时必须初始化,类似于const关键字
auto a; //错误
auto a1=3; //正确
- 定义在一个auto序列的变量必须始终推到同一类型
auto a=10,b=5.; //错误
auto a=10,b=5 ; //正确
- 如果初始化表达式是引用或const,则去除引用或const语义
int a{10};
int &b=a;
auto c=b; //c的类型为int,而非int&
const int a1{10};
auto b1=a1; //b1的类型为int,而非const int
- 如果auto关键字带上&号,则不去除引用或const语义
int a=10;
int& b=a;
auto& c=b; //此时c的类型为int&
const int a1=10;
auto& c1=a1; //此时c1的类型为const int
- 初始化表达式为数组时,auto关键字推导类型为指针
int a[3]={1,2,3};
auto b=a;
cout<<typeid(b).name()<<endl; //b的数据类型为整形指针
result: int *
- 若表达式为数组且auto带上&,则推导类型为数组类型
int a[3]={1,2,3};
auto& b=a;
cout <<typeid(b).name()<<endl; //b的数据类型为整形数组
result: int [3]
- c++14中,auto可以作为函数的返回值类型和参数类型
建议:尽量使用auto(为了代码的正确性、性能、可维护性、健壮性以及方便)
2. 自动类型推导decltype
在编译时期推导一个表达式的类型,而不用初始化
何时用decltype?
主要用于泛型编程
3. 用using替代typedef
using UInt=unsigned int;
UInt x=24;
4. 空指针nullptr
C++03中,空指针使用“0”(#define NULL 0)来表示;
C++11中引入保留字nullptr 作为空指针
4. 一元作用域解析运算符
局部变量名与全局变量名相同时,可使用::访问全局变量
#include<iostream>
int v1=10;
int main()
{
int v1=5;
std::cout<<"local variable v1 is "<<v1<<std::endl;
std::cout<<"global variable v1 is "<<::v1<<std::endl;
return 0;
}
5. 基于范围的for循环
基于范围的for循环的语法
for(元素名变量:广义集合){循环体}
- “元素名变量” 可以是引用类型,以便直接修改集合元素的值
- “元素名变量”也可以是const类型,避免循环体修改元素的值
- 其中“广义集合”就是range(范围),是一些元素组成的一个整体
限制
- 基于范围的循环仅限于for语句
- do…while();和while(){}不支持基于范围的循环
其他:c++推荐不推荐使用原始数组
std::array<int,4> a2{1,2,3,4};
for(auto i:a2)
{
std::cout<<i<<std::endl;
}
6. 带有初始化器的if和switch语句(C++17)
int foo(int arg)
{
return arg;
}
int main()
{
if(auto x=foo(42);x>40)
***
else
***
auto x=3;
}
为什么要使用带有初始化器的if语句
- 本应限制于if块的变量,侵入了周边的作用域
- 若编译器确知变量作用域限于if块,则可更好地优化代码
7. 类成员的初始化
就地初始化
在c++03标准中,只有静态常量整形成员才能在类中就地初始化;c++标准中,非静态成员可以在它声明的时候初始化。
class s
{
int m=7;
std::string t{"constructor run"};
int b[3]={1,2,3};
int a[]={1,2,3}; //error,数组类型成员不能自动推断大小
}
构造函数初始化列表
C++11的数组类
C风格数组和C++11风格数组
- C Style Array
- 会退化为指针
- 不知道自己的大小
- 两个数组之间无法直接赋值
- 不能自动推导类型
- C++ Style Array
- 是一个容器类,有迭代器
- 可直接赋值
- 知道自己的大小
- 能和另一个数组交换内容
- 能以指定值填充 fill()
- 取某个位置的元素(越界检查)
std::array<int,10> x;
std::array<char,5> y{'h','e','l','l','o'};
C++17 Type Deduction for std::array
c++17引入一种新特性,对类模板的参数进行推导
std::array a1{1,2,3}; //std::array<int,3> a1{1,2,3};
成员函数
- 元素访问
- 容量
- 操作
- 迭代器