• ###学习《C++ Primer》- 1


    点击查看Evernote原文

    #@author:      gr
    #@date:         2014-09-30
    #@email:        forgerui@gmail.com
    

    记录读书过程中一些知识点。可能不系统,:-)

    Part 1: C++类(第7章)

    一、某些类不能依赖于默认构造函数

    默认构造函数:不接受任何实参的构造函数

    1. 只有当类没有声明任何构造函数时,编译器才会自动地生成默认构造函数。
    2. 合成的默认操作可能执行错误的操作。
      比如:定义在块中的内置类型或复合类型(比如数组指针)的对象被默认初始化,则它们的值将是未定义的,应该需要手动进行定义。
    3. 有时候,编译器不能为某些类合成默认的构造函数。
      比如:有些成员类没有提供默认构造函数。

    二、默认构造函数(C++11)

    struct Sales_data{
        Sales_data() = default;
    };
    

    =default:C++11标准规定,如果需要默认的行为,那么可以加上= default来要求编译器生成构造函数。

    三、类内成员初始化

    struct Sales_data{
        //有些编译器不支持
        double a = 1.0;
    };
    

    有些编译器支持内置类型的数据成员提供了初始值,有些编译器不支持类内初始值,那只能使用构造函数初始值列表或构造函数进行初始化。

    四、构造函数的初始值有时必不可少

    有些类型必须使用初始值进行初始,如引用const,和没有默认构造函数的类。这些类型无法在构造函数体中初始,只能放到初始值列表中。

    此外,初始化和赋值的区别事关底层效率问题,前者直接初始化数据成员,后者先初始化后赋值,效率低。

    class ConstRef{
        public:
            ConstRef(int ii);
        private:
            int i;
            const int ci;
            int &ri;
    };
    ConstRef::ConstRef(int ii){
        //正确
        i = ii;
        //错误:const类型无法进行赋值
        ci = ii;
        //错误:引用类型无法进行初始化
        ri = i;
    }
    

    五、委托构造函数(C++11)

    委托构造函数把工作委托给另一个构造函数,受委托的构造函数的初始值列表和函数体被依次执行。如果,函数体内有代码,会先执行受委托函数的函数体,之后才执行委托者的函数体。

    struct Sales_data{
        public:
            //非委托构造函数
            Sales_data(std::string s, unsigned cnt, double price):bookNo(s), units_sold(cnt), revenue(cnt*price){}
            //其余构造函数全都委托给另一个构造函数
            Sales_data():Sales_data("", 0, 0){}
            Sales_data(std::string s):Sales_data(s, 0, 0){}
            Sales_data(std::istream &is):Sales_data(){ read(is, *this); }
    };
    

    六、使用默认构造函数

    //错误:声明了一个函数而非对象
    Sales_data obj();
    //正确:obj2是一个对象而非函数
    Sales_data obj2;
    

    七、explicit抑制隐式转换

    `explicit`只能在类内使用,可以阻止类型进行隐式转换。
    
    class Sales_data{
        public:
            //只允许在类内构造函数
            explicit Sales_data(std::string s):bookNo(s){}
    };
    

    八、static成员

    static成员与类关联在一起,不与对象绑定在一起。static只出现在类内部的声明语句中。

  • 相关阅读:
    [转]Eclipse之ANT使用
    [转]深入浅出解读微软云计算:让云触手可及
    [转]android的selector,背景选择器
    [转]android 个人铃声设置代码
    [转]Android中的Frame动画
    [转]WebGL中文教程
    节点遍历函数
    javascript深拷贝
    javascript 跨浏览器的事件系统
    CSS选择器的权重详解
  • 原文地址:https://www.cnblogs.com/gr-nick/p/4034391.html
Copyright © 2020-2023  润新知