zoukankan      html  css  js  c++  java
  • c++类的构造函数

    1、构造函数

    构造函数的任务是初始化类对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。

    • 构造函数名与类名相同
    • 没有返回类型
    • 可以重载
    • 不能声明成const

    1.1、合成的默认构造函数

    如果我们没有为类显式的定义构造函数,编译器会为我们隐式的定义一个默认构造函数(不需要任何参数)又叫做合成的默认构造函数)这个构造函数按照下面规则初始化类的数据成员:

    1. 如果有类内初始值,用它来初始化成员(比如上面的units_sold=0,revenue=0.0)。类内初始值必须以=或{}表示。
    2. 否则,默认初始化(如bookNo被初始化为空字符串)。

    1.2、自定义默认构造函数

     一般情况下,类都需要定义一个默认构造函数,主要有以下三个原因:

    1. 一旦定义了其他构造函数,除非我们自己再定义一个默认构造函数,否则这个类将没有默认构造函数。
    2. 若类中含有内置类型或复合类型(比如数组和指针)的数据,如果没有提供类内初始值(有的编译器可能不支持类内初始值),使用合成的默认构造函数的值将是未定义的。
    3. 如果类中包含其他类的对象,而这个对象没有默认构造函数,那么编译器不能为类合成默认构造函数,我们必须自己定义一个默认构造函数。

    (1)default

    Sales_data()=default;

    函数名与类名相同,没有参数列表,参数列表后面加上=default要求编译器生成默认构造函数。

    (2)默认实参构造函数

    如果一个构造函数为所有参数都提供了默认实参,则它实际上也定义了默认构造函数。

    class C1{
    public:
      C1(int );
      void prt(){ cout << i; };
    private:
      int i;
    };

    C1::C1(int ii=9){
      i = ii;
    }

    C1 cc;//定义一个对象
    cc.prt();//输出9

    1.3、使用默认构造函数

    注意下面2种定义:

    C1 obj1();//obj1是返回值为C1类型的函数

    C1 obj2;//obj2使用默认构造函数初始化

    1.3、构造函数初始值列表

    Sales_data(const string & s,unsigned n,double p):bookNo(s),units_sold(n),revenue(p*n){}

    冒号和花括号中间的部分就是构造函数的初始值列表。如果某个数据成员没有被初始值列表包括,这个值将以与合成默认构造函数相同的方式隐式初始化,对于没有初始值列表的构造函数,也是以同样的方式初始化。

    2、构造函数初始值列表

    (1)与一般的构造函数的区别

    Class1::Class1(const string &s,int n){

      bookNo=s;

      units_sold=n;

    };

    这种构造函数时对数据成员执行的是赋值操作,该类的成员在构造函数体之前已经执行了默认初始化。而使用初始值列表的构造函数则直接初始化了类的数据成员。

    (2)必须使用构造函数初始值列表的类型

    如果成员是const、引用、或属于某种未提供默认构造函数的类类型,我们必须通过构造函数初始值列表为这些成员提供初值:

    class C1{

    public:

      C1(int ii);

    private:

      int i;

      const int ci;

      int &ri;

    };

    C1::C1(int i){

      i=ii;//正确

      ci=ii;//错误,不能给const赋值

      ri=ii;//错误,ri未初始化

    }

    (3)成员初始化的顺序

    构造函数初始值列表只用于初始化成员的值,成员的初始化顺序是按照它们在类中出现的顺序执行的,而与它们在构造函数初始值列表中的顺序无关
    class C1{

      int i;

      int j;

    public:

      C1(int val):j(val),i(j){}//构造函数首先用j初始化i,而j是未定义的,程序报错。

    };

  • 相关阅读:
    阿衣楚往事
    加速计算机启动
    此一生,与谁相逢v
    关于cmd代码
    关于POJO
    ERP,SOA与J2EE什么关系
    QoBean技术文档(1):QoBean的基础技术
    ed 1.7 支持60种编程语言的免费编辑器
    面试必问的16个经典问题的回答思路
    Java 多线程间的通讯
  • 原文地址:https://www.cnblogs.com/StormWendy/p/8453812.html
Copyright © 2011-2022 走看看