c++11标准

1. auto

auto的使用限制

  1. auto变量在定义时必须初始化,类似于const关键字
auto a;    //错误
auto a1=3; //正确
  1. 定义在一个auto序列的变量必须始终推到同一类型
auto a=10,b=5.;  //错误
auto a=10,b=5 ;  //正确
  1. 如果初始化表达式是引用或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
  1. 如果auto关键字带上&号,则不去除引用或const语义
int a=10;
int& b=a;
auto& c=b;  //此时c的类型为int&

const int a1=10;
auto& c1=a1;  //此时c1的类型为const int
  1. 初始化表达式为数组时,auto关键字推导类型为指针
int a[3]={1,2,3};
auto b=a;
cout<<typeid(b).name()<<endl;  //b的数据类型为整形指针  

result: int *
  1. 若表达式为数组且auto带上&,则推导类型为数组类型
 int a[3]={1,2,3};
 auto& b=a;
 cout <<typeid(b).name()<<endl;  //b的数据类型为整形数组

result: int [3]
  1. 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};

成员函数

  • 元素访问
  • 容量
  • 操作
  • 迭代器

c++11对类型系统的增强

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值