C++ primer(10)-对象和类 共有/私有类访问、类的数据成员、类方法/创建和使用类对象 构造/析构函数

C++ primer(十)--对象和类 共有/私有类访问、类的数据成员、类方法/创建和使用类对象 构造/析构函数

    以前都是从C到C++过度的时期,从这开始才是真正的C++精华的开始。OOP的最重要的特性:

  • 抽象
  • 封装和数据隐藏
  • 多态
  • 继承
  • 代码的可重用行

    这一文章会设计关于类的所有初级基础知识。关于面向过程编程和面型对象编程解释中一句很关键的话,用户与数据交互的方式有三种:初始化、更新和报告--这就是用户接口。采用OOP方法时,首次从用户的角度考虑对象--描述对象所需的数据以及描述用户与数据交互所需的操作。完成对接口的描述后,需要确定如何实现接口和数据存储,最后,使用新的设计方案创建出程序。

一、抽象和类

    类型是什么?指定基本类型完成的三项工作:

  • 决定数据对象需要的内存数量
  • 决定如何解释内存中的位
  • 决定可使用数据对象执行的操作或方法

    C++中的类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操作数据的方法组合成一个整洁的包。通常,C++程序员将接口(类定义)放在头文件中,并将实现(类方法的代码)放在源代码文件中。

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

    对象使用方法时,掉哟个成员函数时,它将使用被用来调用它的对象的数据成员。所创建的每个新对象都有自己的存储空间,英语存储其内部变量和类成员:当同一个类的所有对象共享同一组类方法,既每种方法只有一个副本。在OOP中,调用成员哈数被称为发送消息,因此将同样的消息发送给两个不同的对象将调用同一个方法,但该方法被用于不同的对象。

  1)使用类

    C++的目标是使得使用类与使用基本的内置类型(int和char)尽可能相同。要创建类对象,可以声明类变量,也可以使用new为类对象分配存储空间按。可以将对象作为函数的参数和返回值,也可以将一个对象赋给另一个

二、类的构造函数和析构函数

    上面红字部分说明了C++的目标,但是目前还不能那样,因为数据部分的访问状态是私有的,这意味着程序不能直接访问数据成员,程序只能通过成员函数来访问数据成员,因此需要设计合适的成员函数,才能成功地将对象初始化(如果使数据成员称为公有,而不是私有,违背了类的一个主要出初衷:数据隐藏),一般来说,最好是在创建对象时对它进行初始化,例如:

    Stock gift://Stock 是已经定义的类

    gift.buy(10,22);

    但是对象的部分成员的值是不存在的,为了更加大众普及化,有一个特殊的成员函数--类构造函数,专门用于构造新对象、将值赋给他们的数据成员。更准确的书,C++为这些成员函数提供了名称和使用语法,而程序员需要提供方法定义。名称与类名相同。Stock类一个可能的构造函数是名为Stock()的成员函数,构造函数的原型和函数头有一个有趣的特征--虽然没有返回值,但没有被声明为void类型。构造函数没有声明类型。

  1)声明和定义构造函数

    有了构造函数,程序声明对象时,将自动调用构造函数。构造函数的参数名不能和类成员名称一样。

  2)使用构造函数

    C++提供了两种使用构造函数来初始化对象的方式,第一种就是显示的调用构造函数:

    Stock food=Stock("fds",20,12);

    另一种是隐式的调用:

    Stock gram("fds",34,32);

    这种调用方式和上面的显示调用一样。

    构造函数的使用方式不同于其他类方法,一般来说,使用对象来调用方法:stock1.show();

    但无法使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的。因此构造函数被用来创建对象,而不能通过对象来调用。如果没有任何构造函数,则C++将自动提供默认的构造函数。不做任何工作。当且仅当没有任何构造函数时,编译器才会提供默认构造函数。为类定义了构造函数后,当没有提供默认的构造函数,则下面的声明将出错:

    Stock stock1;

    如果要创建对象,而不显示地初始化,则碧玺定义一个不接受任何参数的默认构造函数。定义默认构造函数的方式有两种:给已有的构造函数的所有参数提供默认值;一种是通过函数重载来定义另一个构造函数--一个没有参数的构造函数:

    Stock();

    同时固定只能有一个默认的构造函数,因此不要同时使用上述的两种方式。

  3)const成员函数

    const Stock lan=Stock("fdsaf");

    land.show();

    上述方法是不可行的,因为show()的代码无法确保调用对象不被修改--调用对象和const一样,不能被修改。我们以前通过将函数参数声明为const应用或指向const的指针来解决这种问题。但这里存在的无法问题:show()方法没有任何参数。相反,它所使用的对象是由方法调用隐式地提供的。C++的解决方法是将const关键字放在函数的括号后面。

    void show() const;

三、this指针

    每个类成员函数都设计一个对象,既调用它的对象。但有的时候可能设计到两个对象,在这种情况下需要使用C++的this指针。来直接的:

    const Stock & topval(const Stock & s) const;

    该函数隐式地访问一个对象,而显示地访问另一个对象,并返回其中一个对象的引用。括号中的const表明,该函数不会修改被显示地访问的对象;而括号后的const表明,该函数不会修改被隐式地访问的对象,由于函数返回两个const对象之一的引用,因此返回类型也应为const引用。

    Stock top;

    top=stock1.topval(stock2);//函数的作用就是比较对象一个私有成员的大小

    隐式地访问stock1,而显示地访问stock2.

const Stock & Stockl::topval(const Stock & s) const

{

    if(s.total_val>total_val)

         return s;

    else

         return ????;

}

    其中问号的部分怎么办,C++解决这种问题的方法是:使用被称为this的特殊指针。this指针指向用来调用成员函数的对象。这样,函数掉哦那个sock1.topval将this设置为stock1对象的地址,使得这个指针可用于topval()方法。一般来说,所欲的类方法都将this指针设置为调用它的对象的地址。每个成员函数都有一个this指针。this指针指向调用对象,如果方法需要引用整个调用对象,则可以使用表达式*this。在函数的括号后面使用const限定符将this限定为const,这样将不能使用this来修改对象的值。可以将上面的问号部分改为*this。