一级棒(Eachfun)
偷猫的个人主页
RSS订阅
类的构造函数
发表时间:2006-08-15 23:43:00 关键词:C++,MFC,VC,Primer,编程,教程,读书

  引用:构造函数是特殊的成员函数。
  笔记:构造函数的确是一类“特殊”的成员函数。它的特殊性至少表现在以下几个方面:一是它的调用不用程序员操心,只要类对象被创建它就会被调用,而且它不允许被程序员显式地调用。二是它们是必需的,如果程序员偷懒,编译器将自动创建简单的构造函数。三是它们的名字不用程序员多考虑,直接与类名相同。四是它们没有返回值。
  下面详说这几个特性:
  一、它们在类对象被创建时自动调用,创建对象可能有以下方法:程序中用声明变量的语句直接声明创建,或者在程序中用new关键字动态创建。这两种方法都可以创建单个对象,也都可以创建对象数组。只要有一个对象被创建,构造函数就被调用一次。
  如果程序员想显式地调用构造函数那是不行的。正因为如此,构造函数中还有一种特定的部分叫“初始化列表”,通过它程序员可以调用基类或成员的构造函数。必竟类的设计千差万别,如果某个类的基类或(和)成员有多个构造函数,那么,该类必须能够指定用哪一个构造函数,否则类的功能将大打折扣。调用构造函数不是程序员的事,程序员不应该管也管不了。初始化列表为解决这个问题而生,所以只有构造函数才有初始化列表,其它函数不能有。
  上面说到的“大打折扣”究竟是怎样的折扣呢?如果不能指定基类和成员用哪一个构造函数,那就只好让编译器去挑了,构造出来的对象往往不符合要求,只好调用基类和成员的其它函数,比如赋值函数或其它进行参数设定的函数——当然,基类和成员必须包含这样的函数。这样就浪费了资源。
  二、类必须包含构造函数——确切地说是必须包含无参数构造函数和拷贝构造函数——原因是因为它们的调用是自动的。如果这两个函数根本就没有,你让系统如何调用?所以,C++也不含糊,你要是懒得写,它就帮你写一个简单的。简单就意味着至少要丧失一些功能,如果类设计得比较复杂(比如包含指针操作)还可能引起灾难性事故。
  三、函数名与类名一致。构造函数的名称是必须特殊的,即使这个特殊不表现在与类名相同,也必须找到另一个规则来实现。因为系统要自动调用这些函数,你就必须让系统知道哪些函数是构造函数。
  第四个特性直接改变了C/C++语言的一条规则:C语言规定,如果函数没有明显指出返回类型,那么C语言认为返回值是int型。C语言之所以可以有这条规则,一是因为返回int的函数很多,二是因为即使没有返回值,也必须指明void。当时制定规则的人无法预料到,C++中居然会出现“连void都不是的返回值”的函数,void虽然表示不返回任何值,必竟与类构造函数的“没有返回值”是两码事。于是,C++新标准规定:在定义或声明函数时,没有显式指定返回类型中不合法的。当然类的构造函数除外。
  构造函数的出现有它的可行性和必然性。可行性是由于C++的类允许包含成员函数,既然类可以包含普通的成员函数,那么包含特殊的函数自然也不在话下。必然性是由于类的对象往往必须经过特定的初始化。C++到来之前,C语言中的数据类型只是内置类型。对于内置类型对象,如果忘了初始化,大不了这个对象失去作用,但是不会导致大的问题。比如一个int型值,无论内存如何随机,它的取值范围都不会超过int能表达的范围,对它进行运算也不会产生危险(溢出不能算危险,即使初始化过的数据也不能保证不溢出,而且溢出只是一种逻辑问题)。但是现在的类不这么简单了,忘了初始化往往将带来运行错误。于其每次都要考虑数据的初始化,还不如把这个初始化写成统一的函数,让系统自动调用来得既安全又方便。

本站特约顾问律师常州东晟律师事务所朱立律师(电话13915029670,QQ646146109)提醒您:
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
相关评论
发表评论
称呼:
QQ:
邮箱:
链接:
内容:
搜索: 百度搜索 Google搜索
Copyright©2000 - 2011 Eachfun.Com, All Rights Reserved 一级棒网络
备案号忘了带来
一级棒建站系统 http://www.eachfun.com 一级棒版权所有,未经许可不得商用!