zoukankan      html  css  js  c++  java
  • 构造、析构、赋值运算

    一、C++默默编写并调用了哪些函数

    当你写下:

    class CEmpty

    {

    }

    这就好像你写下

    class CEmpty

    {

    public:

          CEmpty(){…}

          CEmpty(const CEmpty &rhs){…}

          ~CEmpty(){…}

          CEmpty& operator=(const CEmpty &rhs){…}

    }

    这些C++默默编写的函数只有在被调用时才会被编译器创建(默认都是public),这里的拷贝

    都是浅拷贝。如果你定义了构造函数,C++就不会为类创建一个默认构造函数(无参构造函数)。

    如果你的泪没有申明copy构造函数,也没申明copy assignment操作符,编译器也会为它

    创建那些函数(如果它们被调用的话)。但是如果你的class里面内含const成员或者reference

    成员,C++会拒绝编译那一行赋值操作,因为C++不允许让reference该指向不同的对象,更改

    const成员也是不合法的,此时你必须定义自己的copy assignment操作符。还有一种情况,如果

    某个base classes 将copy assignment申明为private,编译器会拒绝为其derived classes生成一个

    copy assignment(这个涉及到C++语言的对赋值的内部处理).

    二、如不想使用编译器自动生成的函数,就该明确的拒绝

    1、可以将构造、赋值操作符等申明为私有函数即可,不必实现。

    这个还不是绝对安全,因为member函数和friend函数还是可以调用的。

    不去定义它们的话,不慎调用它们就会获得一个连接错误。

    2、设计一个专门为了阻止copying动作的base class

    例如

    class Cuncopyable

    {

    public:

    Cuncopyable(){};

    ~Cuncopyable(){};

    private:

    Cuncopyable(cosnt Cuncopyable &);

    Cuncopyable& operator=(const Cuncopyable &);

    }

    class A:private Cuncopyable

    {

    }

    前面说了,这样就不会为derived class产生相应默认函数了

    三、为多态基类申明virtual析构函数

    class A{...};

    class B:public A

    {...};

    A *p = new B;

    delte p;

    如果class A(基类)不含虚析构函数,A*类型的指针指向派生类B的对象,当delete p时就不会

    调用B(派生类)的析构函数,实际执行时通常发生的是派生类的成分没有被销毁。类中有虚函

    数时会产生一个虚指针占用一定内存空间。

    所以,带多态性质的基类应该申明一个virtual析构函数,如果class带有任何virtual函数,他就应该有个析构函数。

    classes的设计目的如果不是为了作为基类使用,或不是为了具备多态性,就不该申明虚析构函数。string和所有

    的STL容器都不带虚析构函数。

  • 相关阅读:
    比开源快30倍的自研SQL Parser设计与实践
    集群镜像:实现高效的分布式应用交付
    阿里云中间件首席架构师李小平:云原生实践助力企业高效创新
    大型企业多账号管理“安全心法”
    数据的“敏捷制造”,DataWorks一站式数据开发治理范式演进
    Scheduled SQL: SLS 大规模日志上的全局分析与调度
    基于 Scheduled SQL 对 VPC FlowLog 实现细粒度时间窗口分析
    汽车之家:基于 Flink + Iceberg 的湖仓一体架构实践
    详细介绍Oracle数据库的聚簇技术
    处理百万级以上的数据提高查询速度的方法
  • 原文地址:https://www.cnblogs.com/Mr-Zhong/p/4228099.html
Copyright © 2011-2022 走看看