关于类容易模糊的三个知识点

来源:互联网 发布:阿波波英语软件下载 编辑:程序博客网 时间:2024/05/29 08:21
本次博客 主要复习三个模糊的知识点。其中
> 构造函数与析构函数的定义、声明与使用;
> this指针作为隐含参数以及返回*this对象本身;
> 在类中声明常量的两种方式。
    本博客参考自:http://blog.csdn.net/budf01/article/details/72972727,非常感谢!

一、构造函数与析构函数

    构造函数原型与定义:

    类构造函数用来构造新对象,并将值赋给它们的数据成员。

    构造函数的名称与类名相同。

    程序在声明对象时,将自动调用构造函数。

    构造函数的原型和函数头没有声明类型。

    构造函数的使用:

    第一种是显式地调用构造函数:

Stock food = Stock("World Cabbage", 250, 1.25);

    第二种方式是隐式地调用构造函数:

Stock garment("Furry Mason", 50, 2.5);

    这两种方式本质是一样的,推荐使用。没有像下面这张方法,先创建一个临时对象,赋值给左操作数后再销毁,这样浪费了内存和效率。

Stock food;food = Stock("World Cabbage", 250, 1.25);

    构造函数不仅可用于初始化新对象,还可以对已存在的对象赋新值。这是通过让构造程序创建一个新的临时的对象,然后将内容复制给stock1来实现的,随后程序调用析构函数,以删除该临时对象。

    默认构造函数

    当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。如果已经为类定义了构造函数后,程序员就必须为它提供默认构造函数。

    析构函数

    由构造函数创建对象后,程序负责跟踪该对象;对象过期时,程序将自动调用一个特殊的成员函数—析构函数。

    析构函数由编译器决定何时调用,实际上完成清理工作非常有用。

    析构函数也可以没有返回值和声明类型。与构造函数不同的是,析构函数没有参数。因此,Stock析构函数的原型为:

~Stock();

二、this指针

    this指针指向用来调用成员函数的对象(this被作为隐藏参数传递给方法)。

    每个成员函数(包括构造函数和析构函数)都有一个this指针。this指针指向调用对象。如果方法需要引用整个调用对象,则可以用表达式*this。在函数的括号后面使用const限定符将this限定为const,这样将不能使用this来修改对象的值。

    然而,要返回的值并不是this(因为this是对象的指针),而是对象本身,即*this。

class Bakery{private:    const int Months = 12;        //无效    double costs[Months];    ...

三、类中如何声明常量

    在类中直接声明常量是不可行的,因为声明类只是描述了对象的形式,并没有创建对象(没有开辟内存)。

    方式一:使用枚举型

    在类声明中声明的枚举的作用域为整个类,因此可以用枚举为整型常量提供作用域为整个类的符号名称:

class Bakery{private:    enum {Months =12};    double costs[Months];    ...

    注意:用这种方式声明枚举并不会创建类数据成员。也就是说,所有对象中都不包含枚举。Months只是一个符号名称,在作用域为整个类的代码中遇到它时,编译器用12来替换它。

    方式二:使用关键字static:

class Bakery{private:    static const int Months = 12;    double costs[Months];    ...

    这将创建一个名为Months的常量,该常量与其他静态变量存储在一起,而不是存储在对象中。因此,只有一个Months常量,被所有Bakery对象共享。