C++知识文档五_构造函数和析构函数

构造函数和析构函数

  构造函数  构造函数是类的一种特殊成员函数,一般情况下,构造函数是专门用来初始化对象成员变量的,所以最好不要在构造函数中进行与对象的初始化无关的操作。构造函数在类实例化对象时自动执行,构造函数的名字必须与类名同名,它不具有任何类型,不返回任何值,即使是void也不允许。

  *当没有定义构造函数时,编译器会提供默认构造函数,在某些情况下,编译器未提供构造函数,经过O2编译选项优化之后简单结构的类会变成连续定义的变量。

    可以通过反汇编查看到对象定义时不会产生反汇编代码。

例4.演示各种特殊构造函数的用法(请留意代码中的详细注释)

classCTest

{

protected:

   int m_i1;

   int m_i2;

public:

   void Print()

   {

      printf("m_i1:%dm_i2:%d\n",m_i1,m_i2);

   }

   /*

   缺省构造函数,如果定义类时未指定任何构造函数,

   系统将自动生成不带参数的缺省构造函数

   */

   CTest()

   {

      m_i1=0;

      m_i2=0;

   } 

   /*

   带一个参数的可用于类型转换的构造函数

   */

   CTest(int i1)

   {

      m_i1=i1;

      m_i2=0;

   }

   /*

   带参数的构造函数

   */

   CTest(int i1,int i2)

   {

      m_i1=i1;

      m_i2=i2;

   }

   /*

   拷贝构造函数,如果此函数不定义,系统将生成缺省拷贝构造函数功能,

   缺省拷贝构造函数的行为是:用传入的对象参数的成员初始化正要建立的对象的相应成员

   */

   CTest(const CTest &oTest)

   {

      m_i1=oTest.m_i1;

      m_i2=oTest.m_i2+2;    //区别于缺省拷贝构造函数的行为

   }

   /*

   析构函数,一个类中只能有一个析构函数,如果用户没有定义析构函数,

   系统会自动未类生成一个缺省的析构函数

   */

   ~CTest()

   { 

   }

};

intmain(int argc, char* argv[])

{

   CTest test1;     //调用缺省构造函数

   CTest test2();      //这是函数的声明,不是实例化类

   CTest test3(1);     //调用带一个参数的构造函数

   CTest test4(1,2);   //调用带多个参数的构造函数

   CTest test5=5;      //等价于CTest test5(5);

   //等价于CTest test6(6);

   CTest test6=CTest(6);

   //生成临时对象CTest(5),并把该对象的成员赋值给对象test1

   test1=5;

   //生成临时对象CTest(6,66),并把该对象的成员赋值给对象test1

   test1=CTest(7,77);   

   CTest test8(test1); //调用拷贝构造函数

   CTest test9=test1;  //等价于CTest test9(test1)

   //对象间的赋值,将test9的成员值逐个赋值给test1的成员

   test1=test9;    

   return 0;

}

注意:以上代码实例中,我们可以看出:一个类只有一个构造函数,但是可以有多个构造函数。不同的构造函数具有相同的函数名,但是具有不同的参数个数以及类型,系统根据所传入的参数类型和个数决定需要调用那一个函数。这成为函数的重载。

初始化成员列表   通常在类的构造函数的函数体中初始化类的成员数据,除此外还可以通过初始化成员列表的方式初始化数据成员。

初始化成员列表的形式为:构造函数名(构造函数参数列表):成员1(参数列表1),成员2(参数列表2),,,成员n(参数表n)。

例5、使用初始化成员列表的方式实现构造函数对类的数据成员初始化

classCTest1

{

private:

   int m_iRef;

public:

   CTest1(int iRef)

   {

      m_iRef=iRef;

   }

};

classCTest2

{

private:

   int m_i1;

   int m_i2;

   const int m_iConst;

   //const int m_iConst=0;//请思考:为什么不能在这里直接对该类的数据成员进行初始化?

   CTest1 m_obj;

public:

   CTest2();

};

CTest2::CTest2():m_i1(1),m_iConst(4),m_obj(0)

{

   m_i2=2;

}

注意:以下两种情况必须要使用初始化成员列表的方式来对类的数据成员进行初始化:

类的成员是常量成员初始化    对常量成员赋初始值只能在初始化成员列表中。

类的成员是对象成员初始化    对象成员必须用带参数的构造函数初始化,则该对象成员的初始化必须在初始化成员列表中。


析构函数 

对象的生命期结束时,会自动调用析构函数。析构函数名是在类名前加"~",析构函数同样不能返回任何值,也没有函数参数,并且不能被重载,所以一个类可以有多个构造函数,却只能有一个析构函数。

一般说来,每当创建一个对象时就调用对象的构造函数;每当撤消一个对象就调用该对象的析构函数。具体有以下4种情况:

  对于全局定义的对象,每当程序开始运行,在主函数main(或WinMain)接受程序控制权之前,就调用全局对象的构造函数。整个程序结束时调用析构函数。

  对于局部定义的对象,每当程序流程到达该对象的定义处就调用构造函数,在程序离开局部变量的作用域时调用对象的析构函数。

  对于关键字static定义的局部变量,当程序流程第一次到达该对象定义处调用构造函数,在整个程序结束时调用析构函数。

  对于用new运算符创建的对象,每当创建该对象时调用构造函数,当用delete删除该对象时,调用析构函数。

  参数对象:退出函数前,调用参数对象的析构函数

  返回对象: 若无对象引用,退出函数后,调用返回对象的析构函数,否则与对象引用的作用域一致。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值