More Effective C++:避免缺省构造函数

缺省构造函数(指没有参数的构造函数)在C++语言中是一种让你无中生有的方法。构造函数能初始化对象,而缺省构造函数则可以不利用任何在建立对象时的外部数据就能初始化对象。有时这样的方法是不错的。例如一些行为特性与数字相仿的对象被初始化为空值或不确定的值也是合理的,还有比如链表、哈希表、图等等数据结构也可以被初始化为空容器。

但不是所有的对象都属于上述类型,对于很多对象来说,不利用外部数据进行完全的初始化是不合理的。比如一个没有输入姓名的地址簿对象,就没有任何意义。在一些公司里,所有的设备都必须标有一个公司ID号码,所以在建立对象以模型化一个设备时,不提供一个合适的ID号码,所建立的对象就根本没有意义。

在一个完美的世界里,无需任何数据即可建立对象的类可以包含缺省构造函数,而需要数据来建立对象的类则不能包含缺省构造函数。唉!可是我们的现实世界不是完美的,所以我们必须考虑更多的因素。特别是如果一个类没有缺省构造函数,就会存在一些使用上的限制。

请考虑一下有这样一个类,它表示公司的设备,这个类包含一个公司的ID代码,这个ID代码被强制做为构造函数的参数:

class EquipmentPiece {
 public:
  EquipmentPiece(int IDNumber);
  ...
};


因为EquipmentPiece类没有一个缺省构造函数,所以在三种情况下使用它,就会遇到问题。第一中情况是建立数组时。一般来说,没有一种办法能在建立对象数组时给构造函数传递参数。所以在通常情况下,不可能建立EquipmentPiece对象数组:

EquipmentPiece bestPieces[10]; // 错误!没有正确调用
// EquipmentPiece 构造函数
EquipmentPiece *bestPieces =
new EquipmentPiece[10]; // 错误!与上面的问题一样


不过还是有三种方法能回避开这个限制。对于使用非堆数组(non-heap arrays)(即不在堆中给数组分配内存。译者注)的一种解决方法是在数组定义时提供必要的参数:

时间: 2024-07-30 14:51:12

More Effective C++:避免缺省构造函数的相关文章

缺省构造函数不能处理隐式超构造函数抛出的异常类型 IOException。必须定义显式构造函数

问题描述 缺省构造函数不能处理隐式超构造函数抛出的异常类型 IOException.必须定义显式构造函数 int lastnum = getNum(source.getProperty(""fileName"")); public static int getNum(String Filename) throws IOException { InputStream myxls; myxls = new FileInputStream(Filename); sr =

C#中构造函数和析构函数的用法

函数 摘 要:构造函数与析构函数是一个类中看似较为简单的两类函数,但在实际运用过程中总会出现一些意想不到的运行错误.本文将较系统的介绍构造函数与析构函数的原理及在C#中的运用,以及在使用过程中需要注意的若干事项. 关键字:构造函数:析构函数:垃圾回收器:非托管资源:托管资源一.构造函数与析构函数的原理 作为比C更先进的语言,C#提供了更好的机制来增强程序的安全性.C#编译器具有严格的类型安全检查功能,它几乎能找出程序中所有的语法问题,这的确帮了程序员的大忙.但是程序通过了编译检查并不表示错误已经

类的构造函数

构造函数 a.构造函数名必须与类名相同,不得声明返回类型: b.可以用行参形式为成员赋初值,可以重载: c.返回一个不能传递的指向其定义对象首地址的指针: d.不带任何参数的称为缺省构造函数; e.有个特殊的初始化方式叫"初始化表达式表"(简称初始化表).初始化表位于函数参数表之后.函数体{}之前,规则: ①若有继承,派生类必须在初始化表里调用基类的构造函数: class B:public A {-}; B::B(int x,int y):A(x) {}; ②类的const常量只能在初

C#构造函数和析构函数的用法

构造函数与析构函数是一个类中看似较为简单的两类函数,但在实际运用过程中总会出现一些意想不到的运行错误.本文将较系统的介绍构造函数与析构函数的原理及在C#中的运用,以及在使用过程中需要注意的若干事项. 一.构造函数与析构函数的原理 作为比C更先进的语言,C#提供了更好的机制来增强程序的安全性.C#编译器具有严格的类型安全检查功能,它几乎能找出程序中所有的语法问题,这的确帮了程序员的大忙.但是程序通过了编译检查并不表示错误已经不存在了,在"错误"的大家庭里,"语法错误"

Java构造函数的执行

Java 在创建对象的时候会要执行它的构造函数.不仅如此,Java 还要执行父类的构造函数,往上一级一级直到没有父类为止.对于初学者来说,有三个问题不容易搞懂: 1.父类的构造函数是否一定会执行? 2.是先执行子类的构造函数还是先执行父类的构造函数? 3.如果父类有多个构造函数,那么 Java 会选择哪一个? - 父类的构造函数是否一定会执行? 是的,父类的构造函数一定会执行.所以如果某个类的层次很深,那么它创建对象时就会要执行一大堆的构造函数. - 是先执行子类的构造函数还是先执行父类的构造函

c++中拷贝构造函数的参数类型必须是引用

如果拷贝构造函数中的参数不是一个引用,即形如CClass(const CClass c_class),那么就相当于采用了传值的方式(pass-by-value),而传值的方式会调用该类的拷贝构造函数,从而造成无穷递归地调用拷贝构 造函数.因此拷贝构造函数的参数必须是一个引用   在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识. 但是如果我问你"拷贝构造函数的参数为什么必须使用引用类型?"这个问题, 你会怎么回答? 或许你会回答为了

对象-编译器合成默认拷贝构造函数问题

问题描述 编译器合成默认拷贝构造函数问题 看<深度探索C++对象模型>遇到的问题. P49里的例子对于bitwise copy semantics展现了memberwise的拷贝,但是后面P50下面说bitwise copy semantics不需要合成拷贝构造函数. 在P52页的两个例子中,第一个说没合成,我的理解也就是没有初始化int和char*,但之后的第二个合成了拷贝构造函数,不仅初始化了string,更初始化了int. 我又用vs测试了下,发现可以运行 class B { publi

java超类与子类构造函数的问题

问题描述 如果超类中没有默认构造函数.那么子类一定不能存在默认的构造函数么?子类就必须使用super()或者自己创建构造函数么? 解决方案 解决方案二:怎么会呢?都可以不定义构造器的.解决方案三:如果一个类在定义时没有定义构造方法,那么他的默认构造就是无参的构造方法:(1)子类只继承父类的默认(缺省)构造函数,即无形参构造函数.如果父类没有默认构造函数,那子类不能从父类继承默认构造函数.(2)子类从父类处继承来的父类默认构造函数,不能成为子类的默认构造函数.(3)在创建对象时,先调用父类默认构造

C++构造函数初始化顺序详解_C 语言

1.构造函数.析构函数与拷贝构造函数介绍 构造函数 1.构造函数不能有返回值 2.缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 3.创建一个对象时,系统自动调用构造函数 析构函数 1.析构函数没有参数,也没有返回值.不能重载,也就是说,一个类中只可能定义一个析构函数 2.如果一个类中没有定义析构函数,系统也会自动生成一个默认的析构函数,为空函数,什么都不做 3.调用条件:1.在函数体内定义的对象,当函数执行结束时,该对象所在类的析构函数会被