C++之构造函数与初始化列表

来源:互联网 发布:linux命令入门 编辑:程序博客网 时间:2024/06/12 20:15

1.构造函数的概念和使用  (见代码03class.cpp)

    1.1 概念

    函数名与类名相同函数没有返回值类型(void 也没有)参数随意的函数叫构造函数

    1.2 语法格式:

       class  类名
       {
        类名(形参列表)
        {
        构造函数体;
        }
       };

  1.3 构造函数的两种形式:

     (1)隐式构造
      Student s("wangfei",35);
     (2)显式构造
      Student s = Student("wangfei",35);
      可以在堆区开辟:
      Student* ps = new Student("wangfei",35);
     注意:
      (1)当一个对象被构造时会自动调用构造函数,构造函数一般用于初始化对象中的成员变量
      (2)如果没有一个为类中提供任何构造函数,系统就会提供一个无惨构造函数(叫缺省构造函数,也叫默认构造函数);如果为该类提供了至少一个构造函数,无论是否有参数,系统都不再提供任何形式的构造函数 (见04class.cpp)
    扩展:
        无参构造函数不是指构造函数中必须没有参数而是指可以用无参的形式去调用(也就是有缺省值)

   2.初始化列表及其必要性

  2.1语法格式

     class 类名
     {
      类名(形参表): 成员变量名(形参名),...--->使用()中形参值来初始化括号左边的成员变量
     {
      构造函数体;
      }
     };

  2.2注意:

  成员变量的初始化顺序和初始化列表中的顺序无关,而是取决于成员变量的声明顺序
  笔试题:
  class  Dumy
  {
  private:
  int m_len;
  string m_str;
  public:
  Dumy(string str):m_str(str),m_len(m_str.length()){}
  };
  问题: 先给m_len 初始化,此时m_str还没有初始化,所以m_len得到的结果是无效值
  解决办法:

  Dumy(string str): m_str(str),m_len(str.length()){}

2.3初始化列表的必要性

  复习:C语言中没有明显的区分:
       int i = 10;//声明、定义、初始化

在C++中:
      声明:类定义时的成员变量(不分配内存)
      定义:当使用类创建对象时,对象中对应的成员变量才会被定义,才会分配内存
      初始化:在创建对象时,系统会自动调用构造函数进行初始化,如果构造函数中指定了初始化方式,那么采用指定的初始化方式进行初始化,如果没有指定初始化方式,系统采用默认的初始化方式(对于基本数据类型不做初始化,对于类类型调用默认的构造函数进行初始化);(见代码03init.cpp)
注意:
    (1)类中包含常量和引用型的成员变量时,必须通过构造函数和初始化列表的方式进行显式的初始化(见代码04inti.cpp)
    (2)在子类中显式地构造其基类部分(以后讲到)

  (3)尽可能采用初始化列表的方式进行成员变量的初始化

 3.支持自定义类型转换的构造函数 (见代码 05construct.cpp)

      在目标类型中定义构造函数的格式
      目标类::目标类(const 源类型& 变量名){}
      可以实现从源类型 到目标类型的隐式类型转换
      如:Point3d::Point3d(const Point2d& pt):m_x(pt.m_x),m_y(pt.m_y),m_z(200){}
      可以使用explicit 关键字修饰构造函数,表示该构造函数只能用于显示类型转换,从而防止潜在的错误;

0 0
原创粉丝点击