C++ 11新特性之语法甜点1

简介: C++ 11新特性之语法甜点1

概述

C++ 11中引入了许多简化编程工作的语法上的新特性,我们暂且美其名曰:“语法甜点”。下面,我们将对这些“语法甜点”一一进行介绍。

语法甜点1:序列for循环

序列for循环是一种简化的for循环,可用于遍历一组序列,包括:各种容器、string、数组、初始化列表以及由begin和end函数定义的序列。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vctTemp{1, 2, 3};
    for (auto a : vctTemp)
    {
        cout << a << endl;
    }

    return 0;
}

语法甜点2:成员变量初始化

与Java、C#中的用法一样,可以对成员变量进行就地初始化。

class CPerson
{
private:
    int m_nAge = 10;
    string m_strName = "Mike";
};


语法甜点3:统一的初始化语法

在引入C++ 11之前,有各种不同的初始化语法。在C++ 11中,仍可以使用这些初始化语法,但也可以选择使用新引入的统一的初始化语法。统一的初始化语法用一对大括号{}表示,使用{}初始化语法还可有效地避免窄转换。

#include <iostream>
#include <vector>
using namespace std;
class CPerson
{
public:
    int m_nAge = 10;
    string m_strName = "Mike";
};
int main()
{
    int a{5};
    char c{'X'};
    int p[5] = {1, 2, 3, 4, 5};
    vector<int> vctTemp{1, 2, 3};
    CPerson person{10, "Mike"};
    // b赋值成5,发生了窄转换
    int b = 5.3;
    // 会提示编译错误,避免了窄转换
    int d{5.3};
    return 0;
}


语法甜点4:nullptr

nullptr是C++ 11中新加的一个关键字,用于标识空指针。引入nullptr后,可以解决某些函数重载时的二义性问题。

#include <iostream>
using namespace std;
void Test(int a)
{
    cout << a << endl;
}
void Test(char *p)
{
    cout << p << endl;
}
int main()
{
    int *p = nullptr;
    int *q = NULL;
    // 两个指针值是相等的,bEqual为true
    bool bEqual = (p == q);
    // 编译失败,nullptr不是转换为int
    int a = nullptr;
    // 在C++ 98中编译失败,有二义性;在C++ 11中调用F(int)
    Test(0);
    // 调用F(char *)
    Test(nullptr);
    return 0;
}


语法甜点5:委托构造函数

在引入C++ 11之前,如果某个类有多个重载的构造函数,且这些构造函数中有一些共同的初始化逻辑,通常都需要再编写一个带参数的初始化函数,然后在这些构造函数中调用这个初始化函数。在C++ 11中,再也不用这么麻烦了。我们可以实现一个最基础的构造函数,其他构造函数都调用这个构造函数。

#include <iostream>
#include <sstream>
using namespace std;
class CPerson
{
public:
    CPerson() : CPerson(0, "") { NULL; }
    CPerson(int nAge) : CPerson(nAge, "") { NULL; }
    CPerson(int nAge, const string &strName)
    {
        stringstream ss;
        ss << strName << "is " << nAge << "years old.";
        m_strInfo = ss.str();
    }
private:
    string m_strInfo;
};
int main()
{
    CPerson person(10, "Mike");
    return 0;
}
相关文章
|
11天前
|
存储 编译器 开发工具
01.C++基础语法
本教程系统讲解C++基础语法,涵盖语言特性、编译器使用、命名空间、头文件、修饰符与关键字等核心内容,助你快速掌握C++编程基础。
132 9
|
6月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
215 12
|
8月前
|
编译器 C语言 C++
☺初识c++(语法篇)☺
☺初识c++(语法篇)☺
|
编译器 程序员 定位技术
C++ 20新特性之Concepts
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。 在没有引入Concepts之前,我们只能依靠经验和技巧来解读编译器给出的错误信息,很容易陷入“类型迷路”。这就好比在没有GPS导航的年代,我们依靠复杂的地图和模糊的方向指示去一个陌生的地点,很容易迷路。而Concepts的引入,就像是给C++的模板系统安装了一个GPS导航仪
321 59
|
11月前
|
安全 编译器 C++
【C++11】新特性
`C++11`是2011年发布的`C++`重要版本,引入了约140个新特性和600个缺陷修复。其中,列表初始化(List Initialization)提供了一种更统一、更灵活和更安全的初始化方式,支持内置类型和满足特定条件的自定义类型。此外,`C++11`还引入了`auto`关键字用于自动类型推导,简化了复杂类型的声明,提高了代码的可读性和可维护性。`decltype`则用于根据表达式推导类型,增强了编译时类型检查的能力,特别适用于模板和泛型编程。
124 2
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(三)
【C++】面向对象编程的三大特性:深入解析多态机制
121 1
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(二)
【C++】面向对象编程的三大特性:深入解析多态机制
105 1
|
编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(一)
【C++】面向对象编程的三大特性:深入解析多态机制
135 1
|
12月前
|
C++
C++ 20新特性之结构化绑定
在C++ 20出现之前,当我们需要访问一个结构体或类的多个成员时,通常使用.或->操作符。对于复杂的数据结构,这种访问方式往往会显得冗长,也难以理解。C++ 20中引入的结构化绑定允许我们直接从一个聚合类型(比如:tuple、struct、class等)中提取出多个成员,并为它们分别命名。这一特性大大简化了对复杂数据结构的访问方式,使代码更加清晰、易读。
156 0
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析继承机制(三)
【C++】面向对象编程的三大特性:深入解析继承机制
153 0

热门文章

最新文章