当前位置: 首页 > news >正文

C++ 11中几个我比较喜欢的语法(三)

随着Vsisual Studio 2013 RC版的放出,之前承诺的对C++ 11语法支持已经全部完成,本文是C++ 11中我喜欢的语法系列的最后一部分(一),(二)。

非静态成员直接初始化

在C++ 03的时候,非静态成员变量只能在对象的构造函数里初始化,例如:

    struct A
    {
        int m;
        A() : m (7) { }
    };

当对象成员比较多的时候,这个对象成员的初始化是非常难看的。尤其是在构造函数较多的情况下,由于C++ 03不支持委托构造函数,这一大堆的成员需要在每一个构造函数中初始化一遍,是十分冗繁而容易出错的。

在C++ 11中,非静态成员也能以静态成员那种方式直接初始化的,这样就直观的多了:

    struct A
    {
        int m = 7;
    };

 

启用和禁止默认函数

在C++中,编译器会生成一些默认函数,例如对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A产生四个缺省的函数,如

  1. A(void);                    // 缺省的无参数构造函数
  2. A(const A &a);                // 缺省的拷贝构造函数
  3. ~A(void);                    // 缺省的析构函数
  4. A & operate =(const A &a);    // 缺省的赋值函数

在C++ 11中,支持通过 default delete 两个关键字来管理这默认函数。delete意为禁止默认函数,default则使用默认函数。

例如,当我们自定义你空构造函数时,编译器就不会给我们生成缺省无参构造函数,此时则可以通过= default来让编译器产生默认构造函数。

    struct A
    {
        A() = default;
        A(int n) {}
    };

至于= delete,一个比较典型的用途是可以定义一个不可拷贝的对象,如:

    struct NoCopy
    {
        NoCopy & operator =(const NoCopy &) = delete;
        NoCopy(const NoCopy &) = delete;
    };

另外,= delete也可以用于禁止那些隐式转换而执行的函数,例如:

    struct A
    {
        void foo(int k){}
        void foo(double k) = delete;
    };

这样,类似a.foo(3.2)之类的调用就会有编译错误(话说,应该像C#那样天生报编译错误才更为合理)。

 

类型别名

虽然自C语言时代就支持通过typedef来为类型起别名,但typedef对函数指针起别名显得比较难看,并且不支持模板。因此,在C++ 11种新增了using为对象起别名的语法:

    // typedef std::ios_base::fmtflags flags;
    using flags = std::ios_base::fmtflags;

    // typedef void (*func)(int, int);
    using func = void(*) (int, int);


    template<class T> using ptr = T*;
    //'ptr<T>'
等价于
T 的指针
    ptr<int> x;

转载于:https://www.cnblogs.com/TianFang/p/3306231.html

相关文章:

  • Windows Phone开发工具初体验
  • ubuntu12.04开启Framebuffer
  • 软考--操作系统
  • 计算机数据结构之——什么是艺术品?
  • 开发人员如何了解用户和需求
  • list 导出为excel
  • 软考--系统开发与软件工程
  • 分布式设计与开发(六)------让memcached分布式
  • poj 2421 Constructing Roads 解题报告
  • 发布一个基于 Reactor 模式的 C++ 网络库
  • 定长度结构体数组、不定长度结构体指针初始化
  • 软考--数据库SQL
  • C++默认参数不能是一个引用
  • 【转】一致性哈希算法
  • 面试时,我说谎了——Leo网上答疑44
  • [deviceone开发]-do_Webview的基本示例
  • [译] React v16.8: 含有Hooks的版本
  • “大数据应用场景”之隔壁老王(连载四)
  • 《Java编程思想》读书笔记-对象导论
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • ERLANG 网工修炼笔记 ---- UDP
  • HashMap剖析之内部结构
  • JavaScript实现分页效果
  • k8s如何管理Pod
  • socket.io+express实现聊天室的思考(三)
  • 从伪并行的 Python 多线程说起
  • 服务器之间,相同帐号,实现免密钥登录
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 将回调地狱按在地上摩擦的Promise
  • 解决iview多表头动态更改列元素发生的错误
  • 码农张的Bug人生 - 见面之礼
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 听说你叫Java(二)–Servlet请求
  • 一天一个设计模式之JS实现——适配器模式
  • Java数据解析之JSON
  • kubernetes资源对象--ingress
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # 计算机视觉入门
  • #Lua:Lua调用C++生成的DLL库
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (10)STL算法之搜索(二) 二分查找
  • (6)STL算法之转换
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (vue)页面文件上传获取:action地址
  • (笔试题)合法字符串
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (剑指Offer)面试题34:丑数
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十六)串口UART
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)u-boot-nand.bin的下载
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化