zoukankan      html  css  js  c++  java
  • 条款05:了解C++默默编写并调用哪些函数

    什么时候一个空类,不再是空类了呢?当c++编译器处理之后。

    如果没有定义,编译器会为你产生四个函数:

    1)  默认构造函数

    2)  Copy构造函数

    3)  赋值构造函数

    4)  析构函数

    注意这些函数都是public且是inline的。

    这里还有一点要说明的:不是说编译器一定会为你产生这些函数,而是说,当这些函数被调用时,它们才会被编译器创建出来。

    下面主要谈一谈赋值构造函数:

    举一个例子:

             template<class T>

    class NamedObject{

             public:

                       NamedObject(std::string& name, const T& value);

                       ...

             private:

                       std::string& nameValue;

                       const T objectValue;

    }

    现在考虑下面会发生什么事情:

    std::string newDog("persephone");

    std::string oldDog("satch");

    NamedObject<int> p(newDog, 2);

    NamedObject<int> s(oldDog, 36);

    p = s;

    赋值前,不论p.nameValue和s.nameValue都指向string对象(当然不是同一个)。赋值操作之后,p.nameValue会怎么样呢?

    如果说p.nameValue赋值后,会指向s.nameValue,则你就错了。为什么?

    因为nameValue这个东西是一个指向string对象的引用。C++明文规定:不允许改变引用。

    另一个问题:objectValue会怎么样呢,p.objectValue 会等于36吗?不会,为什么?

    因为在类中,objectValue是const成员。不允许为const成员改变值。

    那么我们怎么做赋值构造函数呢?我们要自己定义,这时,如果我们没有定义赋值构造函数,C++会拒绝此对象的一切赋值。

    另一个例子,如果在base类中,我们把赋值构造函数定义为私有成员。派生类的赋值会怎么样呢?

    这时,如果我们没有定义赋值构造函数,则C++会拒绝这些赋值操作。因为在赋值时,会让基类成员调用基类自己的赋值构造函数,但是这时是私有的,所以就会出问题。

  • 相关阅读:
    jQuery选择器总结
    HTML页面跳转的5种方法
    与孩子共情就是这么简单!
    C#中使用OracleTransaction
    如何查看Mysql服务器上的版本
    使用C#通过Oracle.DataAccess连接Oracle,部署时需要注意版本问题
    使用docker搭建hadoop环境,并配置伪分布式模式
    Hadoop安装教程【转】
    PHP+Hadoop+Hive+Thrift+Mysql实现数据统计分析
    《阿里巴巴 Java 开发手册》划重点!
  • 原文地址:https://www.cnblogs.com/loveyakamoz/p/2772372.html
Copyright © 2011-2022 走看看