(总结)C++的构造函数(初始化列表,缺省/复制和带默认参数的构造函数)和析构函数详解

原创 2012年03月27日 17:55:46

          C++的构造函数(初始化列表,缺省/复制构造和带默认参数的构造函数),拷贝赋值函数(运算符重载)和析构函数详解.


问题:C++中的空类,默认情况下会产生哪些类成员函数?
     系统默认的缺省构造函数和复制构造函数(拷贝构造函数)
     系统默认提供的析构函数.
     系统默认的拷贝赋值函数(运算符重载函数):用于同类对象之间的赋值.
     系统默认的取值运算:当对类的对象进行取地址(&)时会被调用.

1.构造函数法和析构函数存在的必要性和作用:
(1).构造函数的必要性和作用(用构造函数确保初始化):
     解决同种类型的不同对象的初始化问题.保证每个对象的数据成员都有何时的初始值。
(2).析构函数的必要性和作用(用析构函数确保清除):
    回收内存和资源,通常用于释放在构造函数或对象生命期内获取的资源。
    当对象超出它的定义范围时,编译器自动调用析构函数.

2.构造函数和析构函数的种类:
(1).一个类可以有多个构造函数(即构造函数的重载).
    缺省构造函数:不带任何参数的构造函数,.
          当编译器需要创建一个对象而又不知任何细节时,缺省的构造函数就显得非常重要.在一个构造类型中没有构造函数时,编译器会自动创建一个,然而,一旦有其他的构造函数之后就没有缺省构造函数.

     重载的构造函数:带参数的构造函数.
          属于类成员函数的重载,通过参数的个数,类型和顺序形成重载的条件.其中特殊情况是:
                 如果类中有其他的构造函数的话,系统就不会提供默认的缺省构造函数以构造对象.
                 如果类中构造函数带有默认参数的话,防止出现重载二义性而出错.                
                 类中的构造函数形成重载时,注意防止重载函数中存在隐式类型转换而出现重载的二义性. 
     复制构造函数(拷贝构造函数):
           分为系统提供默认的复制构造函数(即浅拷贝或者全盘拷贝),以及自定义的复制构造函数(即深拷贝或者部分拷贝).    

(2).一个类只有一个析构函数(即析构函数不存在重载),
     析构函数也分为系统默认的和自定义的析构函数(完成指定的其他功能).

3.关于复制构造函数(拷贝构造函数)具体知识点:
(1).定义格式:
  类名 (类名+&对象)
{
}
特点:无返回值,参数只有且只能是同类对象的引用.

解疑:为什么不允许定义这种形式 A(A copy) 的拷贝构造函数?

    这个拷贝构造函数在参数传递的过程中又要调用拷贝构造函数本身,而调用拷贝构造函数时又要先进行参数传递,参数传递又要调用拷贝构造函数。。。。。。于是陷入不停的分配堆栈的无限递归中,而每次压栈过程中又嵌套了压栈,致使每一次的压栈都不能完成,因此,编译器通过不了这种形式的拷贝构造函数。

(2).拷贝构造函数(拷贝构造函数)和拷贝赋值函数(赋值运算符重载)的比较:
不同的地方:
       a.拷贝构造函数是在对象被创建并用另一个已经存在的对象来初始化它时调用的;
      如string s1 = "Hello World";
       string s2 = s1;  //等价于string s2(s1);

        b.拷贝赋值函数只能把一个对象赋值给另一个已经存在的对象,使得那个已经存在的对象具有和源对象相同的状态。
        如 string s3;
        s3 = s1;

相同的地方:
       默认的拷贝构造函数和默认的赋值构造函数均采用“按成员拷贝”默认方式来实现。

      以类String的两个对象a、b为例。假设a.m_data的内容为“Hello”,b.m_data的内容为“world”。现将a赋值给b,默认赋值函数的“按成员拷贝”意味着执行b.m_data=a.m_data。这将造成三个错误:

(1)b.m_data原持有的内存没有被释放,造成内存泄漏。

(2)b.m_data和a.m_data指向同一块内存区域,a或b任何一方变动都会影响另一方

(3)在对象被析构时,m_data被delete了两次。


4.构造函数的初始化列表知识点:

1).初始化列表的构造顺序:

     初始化列表中个数据成员的构造顺序与其声明的顺序一致.而不是按照出现在初始化列表的顺序相关.


2.)必须使用初始化列表的情况?

    引用(const)成员和reference类型的成员只能被初始化而不能在初始化列表外进行赋值操作.

    类的继承中基类的构造函数必须通过初始化列表来调用(先调用基类构造函数,然后才是自身的构造函数).

    类的聚合中聚合类的嵌套对象的构造可以放在其构造函数体内进行赋值而不必一定初始化才行,和普通的成员变量一致.


C++类四个默认函数---构造函数、析构函数、拷贝函数、赋值函数

C++构造函数和析构函数默认构造函数指不带参数或者所有参数都有缺省值的构造函数!!!构造函数构造函数、析构函数与赋值函数是每个类最基本的函数。它们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象...
  • anye3000
  • anye3000
  • 2011年06月27日 15:54
  • 6707

C++基础学习笔记----第十课(初始化列表、析构函数)

主要讲解初始化列表的使用方法和注意事项以及析构函数的使用方法,最后解释了在类中直接调用构造函数产生的后果。...
  • u010089238
  • u010089238
  • 2013年12月06日 21:47
  • 1313

关于C++带有缺省参数的构造函数

任何函数都可使用缺省参数,构造函数也不例外。 应该指出:对象的初始化不可能在类中实现而只能在建立对象时在每个对象中单独实现,以便通过各对象的非静态数据成员的不同数值来体现不同对象之间的差异性。 但...
  • u014646686
  • u014646686
  • 2014年11月23日 14:16
  • 1160

类构造函数初始值列表

类成员初始化
  • a1009563517
  • a1009563517
  • 2016年07月20日 22:24
  • 177

c++笔记03---构造函数,初始化表,文件分类,钟表练习,析构函数,this 指针

1.    构造函数     class 类名 {类名(行参表){. . .}}     成员函数名和类名一样;     当一个对象被创建是,构造函数会自动调用被执行;     参数来自于构造实参; ...
  • wolfsun3
  • wolfsun3
  • 2015年09月30日 16:42
  • 361

C++之带有默认参数值的构造函数

在一个类中 ,如果程序员没有写,任何一个构造函数,则编译器将为该类提供一个默认的构造函数,如果程序员对类的构造函数进行了重载,则编译器将不提供默构造函数,这里需要手动书写一个无参的构造函数, 无参的...
  • u012129719
  • u012129719
  • 2015年07月23日 14:57
  • 6271

总结c++类的构造函数 拷贝构造函数 析构函数 赋值运算符重载的特点以及函数调用顺序

对 c++类成员函数中的构造函数 拷贝构造函数 析构函数 赋值运算符重载的一些特点以及函数调用顺序,并附上例子,希望对大家有帮助,有错误大家可以指出来。...
  • wenqiang1208
  • wenqiang1208
  • 2016年10月18日 19:04
  • 1147

默认参数与初始化列表补充

针对前天默认参数与初始化列表机制的一些深究 const类型和引用类型,在创建时,必须进行初始化。就是用参数列表初始化,移到构造函数体内部,则无法通过编译。也就是说,一旦进入构造函数体,初始化就已经完...
  • duringsummer
  • duringsummer
  • 2018年01月20日 14:22
  • 30

从零开始学C++之构造函数与析构函数(二):初始化列表(const和引用成员)、拷贝构造函数

一、构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段 初始化段 普通计算段 (一)、对象成员及其初始化  C++ Code  1 2 3 4 5...
  • Simba888888
  • Simba888888
  • 2013年06月25日 21:50
  • 3214

C++构造函数与析构函数的解析

创建一个对象时,常常需要作某些初始化的工作,例如对数据成员赋初值。 注意,类的数据成员是不能在声明类时初始化的。如果一个类中所有的成员都是公用的,则可以在定义对象时对数据成员进行初始化。如: ...
  • u011392772
  • u011392772
  • 2015年01月16日 09:20
  • 7614
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(总结)C++的构造函数(初始化列表,缺省/复制和带默认参数的构造函数)和析构函数详解
举报原因:
原因补充:

(最多只允许输入30个字)