美文网首页
第十章 对象和类

第十章 对象和类

作者: 鬼枭嗜 | 来源:发表于2019-03-05 15:31 被阅读0次

    面向对象编程(OOP)

    过程性编程和面向对象编程

    采用过程性编程方法时,首先考虑要遵循的步骤,然后考虑如何表达这些数据。

    采用OOP方法时,首先从用户的角度考虑对象——描述对象所需的数据以及描述用户与数据交互所需的操作。完成对接口的描述后,需要确定如何实现接口和数据储存。最后,使用新的设计方法创造出程序。

    什么是接口

    接口是一个共享框架,供两个系统交互时使用。

    类设计尽可能的将共有接口与实现细节分看。公有接口表示设计的抽象组件。将实现细节放在一起并将它们和抽象分开被称为封装。数据隐藏是一种封装,将实现的细节隐藏在私有部分,也是一种封装。封装的另一个例子是,将类函数定义和类声明放在不同的文件中。

    数据隐藏不仅可以防止直接访问数据,还让看法者无需了解数据是如何被表示的。

    不必再类声明中使用关键字private,因为这是类对象的默认访问控制。

    类和结构唯一的区别是,结构的默认访问类型是public而类为private。

    定义成员函数时,使用作用域解析运算符::来标识函数所属类。

    类方法可以访问类的private。

    函数打的函数头使用作用域解析::来指出函数所属的类。

    例如

    double Box::getVolume(void){  }

    内联方法

    其定义位于类声明中的函数都将自动称为内联函数。如果愿意,也可以在类声明之外定义成员函数,并使其称为内联函数。为此只需在类实现部分中定义函数时使用inline限定符即可。

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

    通常,数据成员被放在私有部分中,成员函数被放在公有部分中,因此典型的类声明的格式如下:

    class className

    {

    private:

        data member declarations

    public:

        member function prototypes

    };

    类的构造函数和析构函数

    类的构造函数是类的一种特殊的成员函数,他会每次创建类的新对象是执行。

    构造函数的名称和类的名称完全相同,并且不会返回任何类型,也不会返回void。构造函数可用于为某些成员变量设置初始值。

    默认的构造函数没有任何参数,但如果需要,构造函数也可以带有参数。这样在创建对象时就会给对象赋初始值

    参数名不能与类成员相同

    使用构造函数

    Stock food =Stock ( 10.0);

    等价于 Stock food(10.0);

    使用new也可如此 Stock *pstock = new Stock(10.0);

    无法使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的。因此构造函数被用来创造对象,而不能通过对象来调用。

    为类定义了构造函数后,程序员就必须为它提供默认构造函数。如果提供了非默认构造函数,但没有提供默认构造函数,则下面声明将出错。

    Stock stock1;

    这样做的原因可能是想禁止创建为初始化得对象。然而,如果要创建对象,而不显式地初始化,则必须定义一个不接受任何参数的默认构造函数。定义默认构造函数的方法有两种,一种是给已有构造函数的所有参数提供默认值。另一种方法是通过函数重载来定义另一个构造函数——一个没有参数的构造函数。

    Stock();

    使用初始化列表来初始化字段

    Line::Line(double len):length(len){

    }

    等价于

    Line::Line(double len){

    length=len;

    }

    当有多个字段X,Y,Z等需要进行初始化,同理也可使用上述方法在不同字段中使用逗号进行分隔。

    析构函数

    和构造函数一样,析构函数的我名称也很特殊:在类名前加上~。另外,和构造函数一样,析构函数也可以没有返回值和声明类型。与构造函数不同的是,析构函数没有参数,因此Stock析构函数的原型必须是这样的:

    ~Stock();

    类的析构函数会在每次删除所创建的对象时执行。析构函数有助于在跳出程序前释放资源。

    在C++11中,可将列表初始化语法用于类。 只要提供与某个构造函数的参数列表匹配的内容,并用大括号将他们括起。

    const 成员函数

    const Stock land = Stock(10.0);

    land.show();

    编译器将拒绝第二句,因为show()的代码无法确保调用对象不被修改——调用对象和const一样,不应被修改。这时需要一种新的语法——保证函数不会修改调用对象。C++的解决方法是将const关键字放在函数的括号后面。也就是说 show()声明应像这样:

    void show() const;

    同样函数定义的开头应像这样:

    void stock::show() const

    接受一个参数的构造函数允许使用赋值语法将对象初始化为一个值。

    Classname object = value;

    如果用 new 运算符动态地建立了一个对象,当用 delete 运算符释放该对象时,先调用该对象的析构函数。

    delete和析构函数的关系:

    delete会去调用被delete的指针所指向对象的析构函数来释放内存,而通常我们会在析构函数中使用delete,在本对象被析构之前先把对象里使用new实例化的一些对象析构,防止内存泻漏

    就是调不调用析构函数看delete的对象是什么了,是类就调用析构,不是也没得可调用,包括new调用构造函数也是一样。)

    如果构造函数使用了new,则必须提供使用delete的析构函数。

    this指针

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

    拷贝构造函数

    拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于:

    通过使用另一个同类型的对象来初始化新创建的对象。

    复制对象把它作为参数传递给函数。

    复制对象,并从函数返回这个对象。

    如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。拷贝构造函数的最常见形式如下

    classname (const classname &obj) {

    // 构造函数的主体

    }

    使用默认拷贝构造函数,那么将不会自动复制堆资源(即通过new得到的资源);所以需要使用拷贝函数使得new得到的资源得以复制。

    https://blog.csdn.net/zjwson/article/details/56301449

    对象数组

    可以用构造函数来初始化数组元素。

    Stock stocks[2]={ Stock(10.0),Stock(12.0)};

    类作用域

    在类中定义的名称的作用域为整个类,作用域为整个类的名称只在该类中是已知的在类外是不可知的。要调用公有成员函数,必须通过对象。

    同样在定义成员函数是,必须使用作用域解析运算符

    抽象数据类型

    ...

    (完)

    相关文章

      网友评论

          本文标题:第十章 对象和类

          本文链接:https://www.haomeiwen.com/subject/wklkeqtx.html