C++Primer Plus 第十章-类的构造和析构函数

C++Primer Plus 第十章 类的构造和析构函数

1)访问控制:类的对象都可以直接访问类的公有部分,但只能通过公有成员函数或友元函数来访问对象的私有部分。公有成员函数是程序和对象的私有成员之间的桥梁。防止程序直接访问数据被称为数据隐藏。


2)将实现细节放在一起并将它们与抽象分开被称为封装。数据隐藏是一种封装。封装的另一个例子是,将类函数定义和类声明放在不同的文件中。


3)无论类成员是数据成员还是成员函数,都可以在类的公有部分或私有部分中声明它。但由于隐藏数据是主要目标之一。因此,数据项通常放在私有部分,组成类接口的成员函数放在公有部分。通常,程序员使用私有成员函数来处理不属于公有接口的实现细节。不必在类声明中使用关键字private,因为这是类对象的默认访问控制。


4)定义成员函数时,使用作用域解析运算符::来标识函数所属的类;类方法可以访问类的private组件。

void Stock::update(double price)

类方法的完整名称中包括类名。我们说Stock::update()是函数的限定名;而简单的update()是全名的缩写,它只能在类作用域中使用。


5)内联函数:其定义位于类声明中的函数都将自动成为内联函数。类声明常将短小的成员函数作为内联函数。当然也可以在类声明之外定义内联函数。这个时候,需要在类的实现部分中定义函数时使用inline限定符。

内联函数的特殊规则要求在每个使用它们的文件中都对其进行定义。确保内联定义对多文件程序中的所有文件都可用、简单的方法是:将内联定义放在定义类的头文件中


6)构造函数没有返回值,没有被声明为void类型。实际上,构造函数没有声明类型。构造函数的参数表示的不是类成员,而是赋给类成员的值。因此参数名不能与类成员名相同。

为避免混乱,一种做法是在数据成员名中使用m前缀;另一种做法是在成员名中使用后缀_。


7)使用构造函数:一种是显式调用:Stock food= Stock("World Cabbage", 250 , 1.25);

另一种是隐式调用:Stock garment("Furry Mason", 50 , 2.5);

甚至使用new: Stock *pstock = new Stock("Electroshock",18, 19.9);这条语句创建一个Stock对象,将其初始化为参数提供的值,并将该对象的地址赋给pstock指针。在这种情况下,对象没有名称,但可以使用指针来管理该对象。


8)默认构造函数:默认构造函数不包含参数。当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。为类定义了构造函数后,就必须为它提供默认构造函数。如果提供了非默认构造函数,而没有提供默认构造函数,将会出错。


9)如果要创建对象,而不显式地初始化,则必须定义一个不接受任何参数的默认构造函数。定义默认构造函数的方法有2种:一是给已有构造函数的所有参数提供默认值:

Stock(const string & co="Error", int n=0, double pr=0.0);

另一种是通过函数重载来定义另一个构造函数---一个没有参数的构造函数:Stock();


10)析构函数:和构造函数一样,析构函数也可以没有返回值和声明类型。与构造函数不同的是,析构函数没有参数。由于析构函数不承担任何重要的工作,因此可以将它编写为不执行任何操作的函数:~Stock();

通常不应在代码中显式地调用析构函数。


11)构造函数的名称和类名相同,但通过函数重载,可以创建多个同名的构造函数,条件是每个函数的特征标(参数列表)都不同。另外,构造函数没有声明类型。通常,构造函数用于初始化类对象的成员,初始化应与构造函数的参数列表匹配。


12)就像对象被创建时程序将调用构造函数一样,当对象被删除时,程序将调用析构函数。每个类都只能有一个析构函数。析构函数没有返回类型(连void都没有),也没有参数,其名称前面加个~。如果构造函数使用了new,则必须提供使用delete的析构函数。





你可能感兴趣的:(C++,C语言)