• C++ 空类,默认产生哪些成员函数


    C++ 空类,默认产生哪些成员函数。

        默认构造函数、默认拷贝构造函数、默认析构函数、默认赋值运算符 这四个是我们通常大都知道的。但是除了这四个,还有两个,那就是取址运算符和 取址运算符 const

    即总共有六个函数

        一个示例如下:

       1: class Empty
       2:  
       3: {
       4:  
       5:   public:
       6:  
       7:       Empty(); // 缺省构造函数
       8:  
       9:       Empty( const Empty& ); // 拷贝构造函数
      10:  
      11:       ~Empty(); // 析构函数
      12:  
      13:        Empty& operator=( const Empty& ); // 赋值运算符
      14:  
      15:        Empty* operator&(); // 取址运算符
      16:  
      17:        const Empty* operator&() const; // 取址运算符 const
      18:  
      19: };

      但是,C++默认生成的函数,只有在被需要的时候,才会产生。即当我们定义一个类,而不创建类的对象时,就不会创建类的构造函数、析构函数等。

     

    1.对于一个类X,如果一个构造函数的第一个参数是下列之一

        a) X&

        b) const X&

        c) volatile X&

        d) const volatile X&

        且没有其他参数或其他参数都有默认值,那么这个函数是拷贝构造函数

        X::X(const X&); //是拷贝构造函数

        X::X(X&, int=1); //是拷贝构造函数

     

    2.类中可以存在超过一个拷贝构造函数,

    class X {
    public:
          X(const X&);
          X(X&);            // OK
    };

    注意,如果一个类中只存在一个参数为X&的拷贝构造函数,那么就不能使用const X或volatile X的对象实行拷贝初始化。

    class X {
    public:
         X();
         X(X&);
    };

    const X cx;
            X x = cx;    // error

        如果一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数。

        这个默认的参数可能为X::X(const X&)或X::X(X&),由编译器根据上下文决定选择哪一个。

     

    测试代码如下:

       1: #include <iostream>
       2: using namespace std;
       3:  
       4: class X {
       5:   public:
       6:     X() { cout << "X()" << endl;}
       7:     X(X& x, int a = 1) {cout << "X(X&)" << endl;}
       8:     X(const X& x) {cout << "const X(X&)" << endl;}
       9:     X(volatile X& x) {cout << "volatile X(X&)" << endl;}
      10: };
      11:  
      12: int main(int argc, char** argv) {
      13:   X x1;
      14:   X x2(x1);
      15:   const X x3;
      16:   X x4(x3);
      17:   volatile X x5;
      18:   X x6(x55;
      19:   return 0;                                                                                                               
      20: }

    运行结果:

    image

    而如果注释掉上面的8 和9行(即取消const 和volatile 拷贝构造函数),会编译错误,如下:

    image

        默认拷贝构造函数的行为如下:

        默认的拷贝构造函数执行的顺序与其他用户定义的构造函数相同,执行先父类后子类的构造。

        拷贝构造函数对类中每一个数据成员执行成员拷贝(memberwise Copy)的动作。

        a)如果数据成员为某一个类的实例,那么调用此类的拷贝构造函数。

        b)如果数据成员是一个数组,对数组的每一个执行按位拷贝。

        c)如果数据成员是一个数量,如int,double,那么调用系统内建的赋值运算符对其进行赋值。

        3. 拷贝构造函数不能由成员函数模版生成。

    struct X

    {
                  template<typename T>
                  X( const T& );    // NOT copy ctor, T can't be X

           template<typename T>
                  perator=( const T& ); // NOT copy ass't, T can't be X
            };

            原因很简单,成员函数模版并不改变语言的规则,而语言的规则说,如果程序需要一个拷贝构造函数而你没
    有声明它,那么编译器会为你自动生成一个。所以成员函数模版并不会阻止编译器生成拷贝构造函数, 赋值运算
    符重载也遵循同样的规则。(参见Effective C++ 3edition, Item45)

     

    另外这些函数,只有在没有时,才会默认生成。而如果提供了声明,即使没有实现,也不会生成默认的函数。

    因此我们通常用的方法是将拷贝构造和赋值设置为private而不实现,以禁止类的拷贝和赋值。

    C++中的空类,默认产生哪些类成员函数?

  • 相关阅读:
    使用QT实现一个简单的登陆对话框(纯代码实现C++)
    vivado + hdmi+ddr3(2)--------基于VIVADO的DDR3三个时钟
    Verilog实现之任意分频电路
    Verilog实现之异步fifo
    vivado + hdmi+ddr3(1)--------HDMI接口协议介绍及实现
    verilog实现之同步FIFO
    FPGA 开发基础---------格雷码转二进制
    verilog之生成语句
    verilog 实现之RAM
    FPGA开发基础--------Handshake Protocol握手协议(1)
  • 原文地址:https://www.cnblogs.com/lovemdx/p/3291569.html
Copyright © 2020-2023  润新知