您的位置:首页 > 其它

第十二章 类和动态内存分配

2017-03-26 17:17 267 查看
2017年3月26日 17:16:02

    不能在类声明中初始化静态成员变量,因为声明只描述了如何分配内存,没有真的分配内存
    静态成员可以在类外使用单独的语句来进行初始化,因为静态成员属于类,不属于对象
    初始化语句指出了类型,并使用了作用域运算符,但没有使用关键字static
    如果静态成员是const整数类型或者枚举型,则可以在类声明中初始化

    在C++11中,类中声明成员变量的同时可以赋值

    在构造函数中使用new来分配内存时,必须在相应的析构函数中使用delete来释放

12.1.2 特殊的成员函数
    C++自动提供一下成员函数:
    1.默认构造函数        2.默认析构函数        3.copy构造函数
    4.赋值运算符        5.地址预算负
    隐式地址运算符 返回 调用对象的地址
    C++还提供了:移动构造函数和移动赋值运算符

1.默认构造函数
    编译器提供一个不接收任何参数,也不执行任何操作的构造函数
    创建对象时,总会调用构造函数

2.copy构造函数
    用于将一个对象复制到新创建的对象中
    常用原型:
        class_name( const class_name& );

    2.1何时使用copy构造函数
        新建一个对象并将其初始化为同类现有对象时,copy构造函数都将调用
        StringBad ditto(motto);
        StringBad metto = motto;
        StringBad also = StringBad(motto);
        StringBad * pStringBad = new StringBad(motto);
        中间两句可能使用copy构造函数直接创建,也可能使用copy构造函数生成临时对象,再赋值,取决于现实

        每当程序生成了对象副本时,编译器都将使用copy构造函数
        具体地说:当函数按值传递对象或函数返回对象时,都会调用
                  编译器生成临时对象,也调用

    2.2 默认的copy构造函数的功能
        默认的copy构造函数逐个复制非晶态成员(浅复制),复制的是成员的值。
        如果成员本身是类对象,将使用这个类的copy构造函数来复制成员对象。
        静态函数不受影响,因为它们属于整个类,不属于对象

        如果类中的静态数据成员,其值将在新对象被创建时发生变化,则应提供一个显示copy构造函数来处理计数问题

        当类成员存在指针时,应使用深拷贝:分配单独的空间
        运算符必须深拷贝,但对于独一无二的对象,应将copy构造函数私有化,来禁止copy

3.赋值运算符
    初始化: StringBad metoo = knot;    //不一定使用赋值运算符,可能只是用copy构造函数
    赋值:    StringBad metoo;
            metoo = knot;    //使用重载的赋值运算符
    初始化总会调用copy构造函数,而使用‘=’运算符也允许调用赋值运算符

    赋值运算符的隐式实现也对成员进行逐个复制,但静态成员不受影响

12.3 在构造函数中使用new时,应注意的事项
    1.如果构造函数中使用new来初始化指针成员,应在析构中使用delete
    2.new和delete必须相互兼容
    3.有多个构造函数时,应保证以相同的方式使用new,因为析构函数只有一个

    C++提供关键字nullptr,来表示空

12.4 返回对象的说明
    1.返回指向const对象的引用:提高效率,但不能返回局部变量的引用
    2.返回指向非const对象的引用:
        常用的情况:重载赋值运算符与'<<'运算符(前者提高效率,后者必须)
    3.返回对象:
        重载'+'运算符,存在调用copy构造函数来返回对象的开销,无法避免
    4.返回const对象:
        防止出现: 对象1 + 对象2 = 对象3    这种错误

    总之:如果方法要返回局部对象,应返回对象;要返回一个没有公有copy构造函数的类对象,必须返回引用;
          若两者都行,则返回引用优先

构造函数使用new的类:
    1.析构函数中必须有相应的delete
    2.每个构造函数应用new来初始化指针,或将指针置空
    3.多个构造函数的new应同意,要么new,要么new[]
    4.应定义一个分配内存的copy构造函数,实现深拷贝
    5.应重载赋值运算符,实现深拷贝
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: