当前位置:  编程技术>c/c++/嵌入式

C++初始化函数列表详细解析

    来源: 互联网  发布时间:2014-10-20

    本文导语:  在以下三种情况下需要使用初始化成员列表: 一,需要初始化的数据成员是对象的情况; 二,需要初始化const修饰的类成员; 三,需要初始化引用成员数据; 原因:C++可以定义引用类型的成员变量,引用类型的成员变量必须...

在以下三种情况下需要使用初始化成员列表:

一,需要初始化的数据成员是对象的情况;

二,需要初始化const修饰的类成员;

三,需要初始化引用成员数据;

原因:
C++可以定义引用类型的成员变量,引用类型的成员变量必须在构造函数的初始化列表中进行初始化。对于类成员是const修饰,或是引用类型的情况,是不允许赋值操作的,(显然嘛,const就是防止被错误赋值的,引用类型必须定义赋值在一起),因此只能用初始化列表对齐进行初始化。成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。(也就是这三种情况必须使用初始化列表)

我们定义一个如下的Person类:

代码如下:

class Person {

public:

  Person() { } //default constructor function

  Person(string name, string phone, string addr)

  {

    m_name = name; //想采用赋值初始化数据成员

    m_phone = phone;

    m_addr = addr;

  }

private:

  const string m_name;

  const string m_phone;

  const string m_addr;

};


编译后发现这个类的第二个带参数的构造函数是错误的。我们创建一个Person对象:

Person p("marcky", "13233232", "cqupt"); //调用带参数的构造函数创建一个Person对象 创建对象的过程分为了两步:

一、从内存中分配实际的空间给对象p,其三个字符串对象的数据成员是调用的默认构造函数初始化为空。也就说,此时为止,对象p的三个数据成员都是一个空的字符串。

二、执行调用的构造函数的函数体语句,完成对数据成员的赋值,以此达到我们期望的创建一个指定Person对象,而不是空对象。

从上面的第二步就可以看到,我们在对三个const对象进行赋值操作,这显然是不允许的操作,因此利用这个构造函数创建Person将以失败告终。要想成功的创建一个特定的Person对象,我们需要构造函数初始化列表:

Person(string name, string phone, string addr)
:m_name(name), m_phone(phone), m_addr(addr){ } //冒号开始定义初始化列表 使用初始化列表创建对象的构造函数同样是通过上述的两个步骤来完成的,不同之处在于创建对象的数据成员时使用的不是默认构造函数,而是根据指定参数调用了相应的构造函数,以此创建特定的对象,而不是空对象。这样一来,对象的数据成员的特定值在创建对象的时候就被赋予了相应的成员,而不是在创建对象完成之后再通过赋值语句去修改数据成员,因此利用构造函数初始化列表就可以成功的创建具有const数据成员的对对象了。

没有默认构造函数的类类型成员,如果不在初始化列表中初始化的话,那么创建该对象的时候,由于没有指定相应的“实参”,编译器就会去调用默认构造函数来创建对象,必然会以失败而告终。

注1:数据成员被初始化的顺序与构造函数初始化列表中的次序无关,而是与成员的定义顺序一致。

注2:使用初始化列表效率更高,如果在构造函数中赋值则是拷贝,如果是初始化列表中则是初始化,赋值和初始化当然效率不一样了。


    
 
 

您可能感兴趣的文章:

  • C++ Strings(字符串) 成员 Constructors:构造函数,用于字符串初始化
  • c++ 构造函数的初始化列表
  • c++类对象初始化方式
  • C++类的静态成员初始化详细讲解
  • c++类对象数组初始化方式
  • C++初始化列表学习
  • c++基础语法:构造函数初始化列表
  • C++直接初始化与复制初始化的区别深入解析
  • C++构造函数初始化顺序详解
  • 浅析C++中结构体的定义、初始化和引用
  • 函数外初始化与函数内初始化详细解析
  • 既然在定义实例变量的时候可以初始化实例变量的值,那还要构造函数干吗?谢谢!
  • php析构函数与对象初始化的例子
  • php初始化对象与析构函数例子
  • php初始化对象和析构函数的简单实例
  • 成员初始化列表与构造函数体中的区别详细解析
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java map(HashMap TreeMap)用法:初始化,遍历和排序详解
  • 请问:BootLoader初始化硬件时,会对PLL和时钟初始化,这个PLL是什么啊,怎么初始化它啊?
  • 关于编译时初始化和动态初始化
  • 为什么在我的引导程序setup.asm里,初始化8253定时器后,程序不能往下运行,而取消初始化后能???
  • C#中结构(struct)的部分初始化和完全初始化实例分析
  • 在Jbuilder中,如何设置一个按钮的初始位置以及初始化按钮的大小?
  • 新手求救!!关于变量初始化
  • 一个关于GDT初始化的问题
  • 操作系统的初始化问题?
  • inode在哪里初始化
  • Java对象初始化顺序的使用
  • 为什么SkinUtils这个类不用实例和初始化?
  • jsp初始化错误是怎么回事
  • 请教NAS1500机器的密码怎么初始化
  • 关于初始化的一点不明白的地方
  • 请问:BootLoader初始化硬件时,会对PLL和时钟初始化,这个PLL是什么啊,怎么初始化它啊? iis7站长之家
  • 非静态初始化模块和构造器的区别?
  • 请问如何判断一个对象是否已经初始化???
  • java安全里面的PrivateKey和PublicKey是怎么初始化的??
  • 怎么给我的控件初始化,并将它显示出来?
  • 关于Struts初始化问题!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3