当前位置:首页 > 编程语言 > 正文

C 构造函数

11-18 编程语言

标签:机制   object   const   public   默认   base   程序员   strong   编译器   

一、默认构造函数

 对于一个类,程序员不声明它的构造函数,在译器需要使用构造函数的时候,将由编译器生成默认的构造函数。

编译器需要使用默认构造函数的情况分为:

  1. 数据成员有默认构造函数
    如果一个类没有任何构造函数,但是它内含有数据成员,而数据成员类有默认的构造函数,那么编译器将为该类合成一个默认构造函数,并在构造函数中以数据成员的声明顺序调用数据成员的默认构造函数已完成数据成员的构造。
    class Point
    { 
    public:
       Point():m_x(0),m_y(0)
       {
       }
       int m_x;
       int m_y;                 
    };
    
    // 编译器将合成Vec3的默认构造函数
    class Vec3
    {
    public:
        Point m_p;
        int m_z;
    };
  2. 基类有默认构造函数
    当一个派生类从一个带有默认构造函数的基类中派生,但程序员没有为派生类声明构造函数。那么编译器会为派生类合成一个默认构造函数,它会调用基类的默认构造函数。
    class Point
    { 
    public:
       Point():m_x(0),m_y(0)
       {
       }
       int m_x;
       int m_y;                 
    };
    
    // 编译器将合成Vec3的默认构造函数
    class Vec3:public Point
    {
    public:
        int m_z;
    };
  3. 类有虚函数
    //编译器将合成Point的默认构造函数
    class Point
    {
    public:
        virtual void print()const;
    };
  4. 虚继承的派生类
    //编译器将合成Vec的默认构造函数
    class Vec:public virtual Point
    {
    }; 

以上四种情况,编译器都会为未声明构造函数的类合成一个默认构造函数以满足编译器的需要,它会调用数据成员或者基类的默认构造函数或者为每个对象初始化虚函数机制和虚基类机制。其他情况下,编译器不会合成默认构造函数。在合成的默认构造函数中,只有base class subobject 和 member class object才会被初始化。所有其他的非静态数据成员(如整数、指针、数组)都不会被初始化。

二、复制构造函数

 

C 构造函数

标签:机制   object   const   public   默认   base   程序员   strong   编译器   

温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/biancheng/11983.html