欢迎光临散文网 会员登陆 & 注册

C++ 定义抽象数据类型

2023-04-12 20:46 作者:S-a-i_  | 我要投稿

构造函数

每个类都分别定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制器对象的初始化过程,这些函数叫做构造函数。构造函数的任务就是初始化类对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。

构造函数是一个比较复杂的问题我们后面还会提到。

构造函数的名字和类名相同,和其他函数不一样的是,构造函数没有返回类型,除此之外类似于其他函数,构造函数的形参可以有参数列表和函数体。类可以包含多个构造函数,同时这些构造函数必须在参数数量或类型上有区别。

不同于其他成员函数,构造函数不能被声明成const。当我们创建类的一个const对象时,知道构造函数完成初始化对象才获得常量属性,所以构造函数在const对象的构造过程中可以写入。


合成的默认构造函数

我们之前的Sales_data没有定义任何的构造器,但是他们还是执行了初始化,所以我们知道他执行了默认初始化,类通过一个特殊的构造函数来控制默认初始化过程,这个函数叫做默认构造器,默认构造器无需任何实参。

编译器创建的构造函数又称为合成的默认构造函数对于大多数类来说这个构造器按照以下规则初始化类的数据成员

1 如果存在类内初始值,用它来初始化成员

2 否则默认初始化该成员


某些类不能依赖于合成的默认构造函数

编译器只有发现类中没有任何构造函数时才会使用默认构造函数,一旦我们定义了其他的构造函数,那么除非我们再定义一个默认构造函数,否则类将没有构造函数。

如果定义在块中的内置类型或复合类型(例如指针和数组)的对象被默认初始化,则他们的指是未定义的。该准则同样适用于默认初始化的内置类型成员,因此含有内置类型或复合类型成员的类应该在类的内部初始化这些成员,或者定义一个自己的默认构造函数,否则可能得到未定义的值。

如果类中包含一个其他类类型的成员,且这个成员没有默认构造函数,那么编译器无法初始化该成员。


定义构造函数

对于Sales_data来说我们使用下面参数定义四个不同的构造函数

1 一个istream&,从中读取交易信息

2 一个const string&,表示isbn编号,一个unsigned表示销售图书的数量和一个double表示图书的价格

3 一个const string&表示isbn编号,编译器将赋予其他成员默认值

4 一个空参数列表(即默认构造函数),既然我们定义了其他构造函数,那么我们必须定义默认构造函数。


=default的含义

首先该构造函数不接受任何实参,所以是一个默认构造函数,我们定义这个构造函数的目的仅是我们既需要其他形式的构造函数有需要默认的构造函数,我们希望这个函数的作用完全等同于之前使用的合成的默认构造函数。

在C++11中,=default既可以和声明一起出现在类的内部,也可以作为定义出现在类的外部,如果=default出现在类的内部,则默认构造函数时内联的,如果在外部则不是内联的。


构造函数初始值列表

这两个定义中出现了新的部分,即冒号到括号的部分,我们把他称为构造函数初始值列表,他负责为新创建的对象一个或几个数据成员赋初值,例如第一个定义,会将s的值赋给bookNo,同时隐式的将unsigned和double本应的初始值赋值给他们。

注意:构造函数不应该轻易覆盖掉类内的初始值,除非新赋的值于原值不同。如果你的编译器不支持类内初始值,则所有构造函数都应该显式的初始化每个内置类型的成员。


在类的外部定义构造函数

当我们在类外定义构造函数时,必须指明该构造函数是哪个类的成员,我们第一个Sales_data就是用来指明是哪个类的构造函数。



C++ 定义抽象数据类型的评论 (共 条)

分享到微博请遵守国家法律