C++新版本特性

本篇博客分享了C++11和C++14的常用新特性。C++11有auto和decltype类型推导、使用using定义别名、tuple元组等特性;C++14则包含模板变量、别名模板、泛型lambda等特性。这些新特性提升了C++的编程效率和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录:

前言

C++11的常用新特性

auto类型推导:

 auto的限制:

auto的应用: 

decltype类型推导:

decltype的实际应用: 

使用using 定义别名: 

 支持函数模板的默认模板参数 :

 tuple元组:

列表初始化:

 lambda匿名函数:

lambda的实际应用 :

for循环:

constexpr: 

右值引用:

std::move

std::forward

nullptr

 std::bind

 std::function

C++14的常用新特性

模板变量: 

 别名模板:

泛型lambda和lambda初始化捕捉

放松对constexpr函数的限制

 deprecated标记:

二进制字面量和数位分隔符: 

 折叠表达式:

类模板参数推导: 

 auto占位的非类型模板形参:

 编译期constexpr if语句/constexpr的lambda表达式:

内联变量:

结构化绑定:

if初始化:

using声明语句可以声明多个名称:


前言

本篇博客分享,对于c++11,14,17的常用c++新版本特性~


C++11的常用新特性

auto类型推导:

C++赋予auto关键字新的含义,用它做于自动类型推导

使用了auto关键字后,编译器会在编译阶段自动推导出变量的类型 

基本使用语法:

auto name = value;

name是变量名字,value是变量的初始值

注意:auto只是一个占位符,在编译期间会被真正的类型所替代,并不违背C++中的变量名必须有明确类型这一规定,只是这个是编译器自动给你推导的 

 auto的限制:

  • auto 不能在函数的参数中使用(auto 要求必须对变量进行初始化)
  • auto 不能作用于类的非静态成员变量(也就是没有 static 关键字修饰的成员变量)中
  • auto 关键字不能定义数组
  • auto 不能作用于模板参数

auto的应用: 

范围for:

int main()
{
    std::vector<int> vi{ 3,5,1,6,7,2,8 };
    for (auto e : vi) {
        std::cout << e << " ";
    }
    
    return 0;
}


//输出结果:3 5 1 6 7 2 8

以及泛型编程中~ 

decltype类型推导:

 auto 和 decltype 关键字都可以自动推导出变量的类型,但它们的用法是有区别的:

auto name = value;

decltype(exp) name = value;

其中name便是变量名,value表示赋给变量的初值~~

auto 根据 = 右边的初始值value推导出变量的类型

decltype根据圆括号内的exp表达式推出变量类型,和 = 右边的value无关

TIP:auto变量一定要初始化,decltype不用,很好理解,auto推导他需要初始化才推得动 

decltype的实际应用: 

下面就是使用的decltype推导的类型,避免使用T::iterator获得容器迭代器指针,因为有些自己实现的容器并没有iterator 

使用using 定义别名: 

C++11中的using 写法跟typedef 等价

template<typename V>
using smap = std::map<std::string, V>;

void test_using()
{
    smap<int> mp1;
    mp1["score"] = 100;
    mp1["age"] = 18;

    smap<string> mp2;
    mp2["name"] = "Merge";
    mp2["address"] = "CN";

    std::cout << mp1["age"] << ": " << mp1["score"] << endl;
    std::cout << mp2["name"] << ": " << mp2["address"] << endl;

}

// 输出:
// 18: 100
// Merge: CN

 支持函数模板的默认模板参数 :

 C++11 支持为函数模板中的参数设置默认值,在实际使用过程中,我们可以选择使用默认值,也可以尝试由编译器自行推导得到,还可以亲自指定各个模板参数的类型

template <typename R = int, typename T, typename U>
R func(T v1,U v2)
{
    return v1+v2;
}

void testFunTemplate()
{
    auto r1=func(5.5,10);                    
    auto r2=func<double>(5.5,10);            
    auto r3=func<double, int, int>(5.5,10); 
	
	cout<<"r1:"<<r1<<endl;
	cout<<"r2:"<<r2<<endl;
	cout<<"r3:"<<r3<<endl;
}

 tuple元组:

tuple的最大特点是:实例化的对象可以存储任意数量、任意类型的数据

例如要储存多个不同类型的元素时;需要函数返回多个数据的时,可以存储在tuple中后返回

void tuple_test()
{
    std::tuple<int, char> fir;

    std::tuple<int, char> mid(std::make_pair(2, '2'));      //{2,'2'}

    std::tuple<int, char> sec(1, '1');                      //右值初始化
    std::tuple<int, int, char> thd(make_tuple(6, 6, '6'));  //右值初始化

    std::tuple<int, char> fourth(sec);                      //左值初始化

    std::cout << std::get<0>(fourth) << " : " << std::get<1>(fourth) << std::endl;
    std::cout << std::get<0>(thd) << " : " << std::get<1>(thd) << " : " << std::get<2>(thd) << std::endl;
}
//输出:
//1 : 1
//6 : 6 : 6

列表初始化:

 在 C++11 中,初始化列表的适用性被大大增加了。它现在可以用于任何类型对象的初始化


class Base
{
public:
    Base(int){}
    
};
int main()
{
    Base b1(123);
    Base b2 = 123;
    Base b3 = { 123 };

    Base b4{ 123 };//c++11加入

    return 0;
}

//上述这些都是可以给定义的对象赋初值的

 lambda匿名函数:

C++11中引入了lambda~~

定义一个lambda匿名函数:

[](){}

这就是lambda的表达式三个括号,省略返回值

[外部访问方式说明
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Obto-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值