当前位置:首页 » 《随便一记》 » 正文

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

12 人参与  2024年02月11日 18:26  分类 : 《随便一记》  评论

点击全文阅读


概述

        C++ 11中引入了许多简化编程工作的语法上的新特性,我们暂且美其名曰:“语法甜点”。书接上篇,我们继续介绍C++ 11中的这些“语法甜点”,也是第二篇关于“语法甜点”的文章。

语法甜点6:模板右边双括号

        在C++ 03中,vector<vector<int>> vctTemp是一个非法的表达式,编译器会认为右边的>>是一个移位操作符,因此必须修改为:vector<vector<int> > vctTemp,即在右边的两个>中间添加一个空格。在C++ 11中,这将不再是一个问题,编译器将能够识别出右边的双括号是两个模板参数列表的结尾。

语法甜点7:static_assert

        静态断言static_assert由一个常量表达式和一个字符串构成。在编译期间,将计算常量表达式的值;如果为false,字符串将作为错误信息输出。

#include <iostream>using namespace std;int main(){    char cNumber = 66;    static_assert(sizeof(cNumber) == 4, "not an interger");    return 0;}

语法甜点8:初始化列表

        在引入C++ 11之前,只有数组能使用初始化列表。在C++ 11中,vector、list等各种容器以及string都可以使用初始化列表了。初始化列表对应的类为initializer_list,vector、list等各种容器以及string之所以可以使用初始化列表,是因为它们重载了参数类型为initializer_list的构造函数(称为初始化列表构造函数)和赋值函数(称为初始化列表赋值函数)。

#include <iostream>#include <vector>#include <map>using namespace std;void Print(const initializer_list<int> &ilData){    for (auto a : ilData)    {        cout << a << endl;    }}int main(){    vector<int> vctNum = {1, 2, 3, 4, 5};    map<string, string> mapID2Name = {{"92001", "Tom"}, {"92002", "Mike"}};    string strText{"Hello CSDN"};    Print({});    Print({1, 2});    Print({1, 2, 3, 4, 5});    return 0;}

语法甜点9:默认或禁用函数

        当我们定义了自己的带参数的构造函数时,编译器将不再生成默认的构造函数,如果此时想使用默认的构造函数,则必须显式地声明并定义不带参数的构造函数。在C++ 11中,我们可以使用default关键字来表明我们希望使用默认的构造函数。

        类似的,当我们不想外部使用编译器自动生成的构造函数或赋值函数时,我们一般需要将其声明成protected或private的。在C++ 11中,我们可以使用delete关键字来表明我们不希望编译器生成默认的构造函数或赋值函数。

class CPerson{public:    CPerson() = default;    CPerson(const CPerson &person) = delete;};

        另外,=delete的声明(同时也是定义)也能适用于非自带函数,以禁止成员函数以特定的形参调用。

class CNoDouble{    void f(int i);    void f(double) = delete;};

        若尝试以double的形参调用f(),将会引发编译错误,编译器不会自动将double形参转换为int再调用f()。 若要彻底禁止以非int的形参调用f(),可以将=delete与模板相结合。

class COnlyInt{    void f(int i);    template<class T> void f(T) = delete;};

语法甜点10:继承的构造函数

        当一个派生类的某个函数隐藏了基类中的某个同名函数时,如果我们想在派生类中导出基类中的这个同名函数,可以通过using Base::Func的方式将基类中的这个同名函数引入到派生类的作用域内。但该方法只对普通成员函数有效,不能用于构造函数。

        在C++ 11中,如果派生类认为基类的构造函数已经足够,则也可以使用using Base::Base的方式将基类的构造函数引入到派生类的作用域内。注意:此时派生类中的成员变量并没有进行初始化,所以应当对这些成员变量进行就地初始化。

#include <iostream>#include <string>using namespace std;class CBase{public:    CBase(int nValue) : m_nValue(nValue)    {        cout << "Base constructor with int" << endl;    }    CBase(double dValue) : m_nValue((int)(dValue * 10))    {        cout << "Base constructor with double" << endl;    }private:    int m_nValue;};class CDerived : public CBase{public:    // 使用 using 关键字引入基类的所有构造函数到派生类中    using CBase::CBase;   // 如果需要添加额外的成员变量或自定义构造函数,可以继续定义    CDerived(const string &strText) : CBase((int)strText.size())    {        cout << "Derived constructor with string" << endl;    }};int main(){    // 调用 CBase(int) 构造函数    CDerived d1(5);    // 调用 CBase(double) 构造函数    CDerived d2(3.14);    // 调用 CDerived(const string &) 构造函数    CDerived d3("Hello CSDN");    return 0;}

        在上面的示例代码中,CDerived类通过using CBase::CBase语句,使得它可以直接使用CBase类中的所有公有和受保护的构造函数。这样,在创建CDerived对象时,可以根据传入的参数类型调用对应的基类构造函数来进行初始化。同时,CDerived类还可以拥有自己的构造函数,以处理新增成员变量的初始化和其他特殊逻辑。


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/68190.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 贵妃每天只想当咸鱼小说(萧兮兮洛清寒)(贵妃每天只想当咸鱼)整本+后续+结局在线阅读
  • 云纾君迟玉:+后续+番外半溪明月枕清风无删减小说在线无广告高口碑小说
  • 新章速递既负如来又负卿是什么小说(莫司淮唐乐薇)完本阅读无广告(莫司淮唐乐薇)
  • 林齐(林齐)火爆小说全集免费阅读_反转传奇林齐:结局+番外无弹窗最新章节笔趣阁(林齐)
  • 萧兮兮洛清寒小说(贵妃每天只想当咸鱼)起点章节+全篇阅读热门作品预订
  • 穿成塌房顶流,我靠爆料翻红(陈昭陈莹静)_穿成塌房顶流,我靠爆料翻红
  • (番外)+(全文)谢青霄林相宜(八零奉子成婚,死对头成了妻管严:全文+结局+番外)全文免费阅读无弹窗大结局_(谢青霄林相宜)最新章节列表_笔趣阁(八零奉子成婚,死对头成了妻管严:全文+结局+番外)
  • 傅修言沈知穗小说(沈知穗傅修言)小说***下载_章节前文+后续(傅修言沈知穗)
  • 陆译林初夏小说(替身攻略失败后摆烂了)全文免费阅读_(替身攻略失败后摆烂了)陆译林初夏小说最新章节列表
  • 全书浏览说好摸鱼打游戏,你爆杀华尔街?(王文斌方幻)_说好摸鱼打游戏,你爆杀华尔街?(王文斌方幻)全书结局
  • (重生后高傲妻子我不爱了)重生后高傲妻子我不爱了(梁言彻尹暖芸)无套路无弹窗全部章节列表
  • (番外)+(全文)傅修言沈知穗:番外+全文+后续(沈知穗傅修言)完整版小说阅读_傅修言沈知穗:番外+全文+后续免费阅读_笔趣阁(沈知穗傅修言)

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1