设为首页 加入收藏

TOP

2.2.2 构造函数
2013-10-07 15:20:36 来源: 作者: 【 】 浏览:76
Tags:2.2.2 构造 函数

2.2.2  构造函数

按下键盘上的F7功能键编译例2-5的代码,然后按下键盘上的Ctrl+F5执行程序,出现如图2.10所示的运行结果。

从图中可以看到,输出了两个很大的负数。这是因为在构造pt对象时,系统要为它的成员变量x和y分配内存空间,而在这个内存空间中的值是一个随机值,在程序中我们没有给这两个变量赋值,因此输出时就看到了如图2.10所示的结果。这当然不是我们所期望的,作为一个点的两个坐标来说,应该有一个合理的值。为此,我们想到定义一个初始化函数,用它来初始化x和y坐标。这时程序的代码如例2-6所示,其中加灰显示的部分为新添加的代码。

 
图2.10  EX03程序的运行结果
例2-6
  1. #include <iostream.h> 
  2. class point  
  3. {  
  4. public:  
  5.      int x;  
  6.      int y;  
  7.      void init()  
  8.      {  
  9.           x=0;  
  10.           y=0;  
  11.      }  
  12.      void output()  
  13.      {  
  14.           cout<<x<<endl<<y<<endl;  
  15.      }  
  16. };  
  17. void main()  
  18. {  
  19.      point pt;  
  20.      pt.init();  
  21.      pt.output();  
  22. }  

然而,对于我们定义的init函数,在编写程序时仍然有可能忘记调用它。那么,能不能在我们定义pt这个对象的同时,就对pt的成员变量进行初始化呢?在C++(www.cppentry.com)当中,给我们提供了一个构造函数,可以用来对类中的成员变量进行初始化。

C++(www.cppentry.com)规定构造函数的名字和类名相同,没有返回值。我们将init这个函数删去,增加一个构造函数point。这时程序的代码如例2-7所示,其中加灰显示的部分为新添加的代码。

例2-7

  1. #include <iostream.h> 
  2. class point  
  3. {  
  4. public:  
  5.      int x;  
  6.      int y;  
  7.      point()    //point类的构造函数  
  8.      {  
  9.           x=0;  
  10.           y=0;  
  11.      }  
  12.      void output()  
  13.      {  
  14.           cout<<x<<endl<<y<<endl;  
  15.      }  
  16. };  
  17.  
  18. void main()  
  19. {  
  20.      point pt;  
  21.      pt.output();  
  22. }  

在程序中,point这个构造函数没有任何返回值。我们在函数内部对x和y变量进行了初始化,按F7编译代码,按Ctrl+F5执行程序,可以看到输出结果是两个0。

构造函数的作用是对对象本身做初始化工作,也就是给用户提供初始化类中成员变量的一种方式。可以在构造函数中编写代码,对类中的成员变量进行初始化。在例2-7的程序中,当在main函数中执行"point pt"这条语句时,就会自动调用point这个类的构造函数,从而完成对pt对象内部数据成员x和y的初始化工作。

如果一个类中没有定义任何的构造函数,那么C++(www.cppentry.com)编译器在某些情况下会为该类提供一个默认的构造函数,这个默认的构造函数是一个不带参数的构造函数。只要一个类中定义了一个构造函数,不管这个构造函数是否是带参数的构造函数,C++(www.cppentry.com)编译器就不再提供默认的构造函数。也就是说,如果为一个类定义了一个带参数的构造函数,还想要无参数的构造函数,则必须自己定义。

知识点  国内很多介绍C++(www.cppentry.com)的图书,对于构造函数的说明,要么是错误的,要么没有真正说清楚构造函数的作用。在网友backer的帮助下,我们参看了ANSI C++(www.cppentry.com)的ISO标准,并从汇编的角度试验了几种主流编译器的行为,对于编译器提供默认构造函数的行为得出了下面的结论。

如果一个类中没有定义任何的构造函数,那么编译器只有在以下三种情况,才会提供默认的构造函数:

1.如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时;

2.如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数);

3.在类中的所有非静态的对象数据成员,它们所属的类中有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数)。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.1 从结构到类 下一篇2.2 C++的特性(2)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: