第10章 对象和类

10.1 过程性编程和面相对象编程

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

10.2 抽象和类

将问题的本质特征抽象出来,并根据特征来描述解决方案。
抽象是通往用户定义类型的捷径。在C++中,用户定义类型指的是实现抽象接口的类设计。

10.2.1 类型是什么

指定基本类型完成了三项工作:
(1)决定数据对象需要的内存数量
(2)决定如何解释内存中的位(long和float在内存中占用的位数相同,但将它们转换为数值的方法不同)
(3)决定可使用数据对象执行的操作或方法
对于内置类型来说,有关操作的信息被内置到编译器中。但在C++中定义用户自定义的类型时,必须自己提供这些信息。

10.2.2 C++中的类

类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。
类规范由两个部分组成:
(1)类声明:以数据成员的方式描述数据部分,以成员函数(被称为方法)的方式描述公有接口
(2)类方法定义:描述如何实现类成员函数
通常,C++程序员将接口(类定义)放在头文件中,并将实现(类方法的代码)放在源代码文件中。

// 程序清单10.1 stock00.h--Stock class interface
#ifndef STOCK00_H_
#define STOCK00_H_

#include <string>

class Stock
{
    private:
        std::string company;
        long shares;
        double share_val;
        double total_val;
        void set_tot()
        {

            total_val = shares * share_val;
        }

    public:
        void acquire(const std::string & co, long n, double pr);
        void buy(long num, double price);
        void sell(long num, double price);
        void update(double price);
        void show();
};

#endif

一、访问控制
访问控制关键字:private、public、protected,它们描述了对类成员的访问控制。
使用类对象的程序都可以直接访问公有部分,但只能通过公有成员函数(或友元函数)来访问对象的私有成员。防止程序直接访问数据被称为数据隐藏。
在这里插入图片描述
类设计尽可能将公有接口与实现细节分开。公有接口表示设计的抽象组件。将实现细节放在一起并将它们与抽象分开被称为封装。
封装的例子:
(1)数据隐藏是一种封装,将实现的细节隐藏在私有部分中
(2)将类函数定义和类声明放在不同的文件中
二、控制对成员的访问:公有还是私有
无论类成员是数据成员还是成员函数,都可以在类的公有部分或私有部分中声明它。但由于隐藏数据是OOP主要的目标之一,因此数据项通常放在私有部分,组成类接口的成员函数放在公有部分;也可以把成员函数放在私有部分中,不能直接从程序中调用这种函数,但公有方法可以使用它们。通常,程序员使用私有成员函数来处理不属于公有接口的实现细节。
结构的默认访问类型是public,类的默认访问类型是private。

10.2.3 实现类成员函数

(1)定义成员函数时,使用作用域解析运算符(::)来标识函数所属的类,类方法的完整名称中包括类名。
(2)类方法可以访问类的private组件。

// 程序清单10.2 stock00.cpp--implementing the Stock class
#include <iostream>
#include "stock00.h"

// Stock::acquire()是函数的限定名
// acquire()是全名的缩写,非限定名,只能在类作用域中使用
void Stock::acquire(const std::string & co, long n, double pr)
{
    company = co;
    if (n < 0) {
        std::cout << "Number of shares can't be negative; " << company << " shares set to 0." << std::endl;
        shares = 0;
    } else {
        shares = n;
    }
    share_val = pr;
    set_tot();
}

void Stock::buy(long num, double price)
{
    if (num < 0) {
        std::cout << "Number of shares purchased can't be negative. Transaction is aborted." << std::endl;
    } else {
        shares += num;
        share_val = price;
        set_tot();
    }
}

void Stock::sell(long num, double price)
{
    if (num < 0) {
        std::cout << "Number of shares sold can't be negative. Transaction is aborted." << std::endl;
    } else if (num > shares) {
        std::cout << "You can't sell more than you have! Transaction is aborted." << std::endl;
    } else {
        shares -= num;
        share_val = price;
        set_tot();
    }
}

void Stock::update(double price)
{
    share_val = price;
    set_tot();
}

void Stock::show()
{
    std::cout << "Company: " << company << std::endl;
    std::cout << "Shares: " << shares << std::endl; 
    std::cout << "Share Price: $" << share_val << std::endl;
    std::cout << "Total Worth: $" << total_val << std::endl;
}

一、成员函数说明
二、内联方法
其定义位于类声明中的函数都将自动成为内联函数,类声明常将短小的成员函数作为内联函数。也可以在类声明之外定义成员函数,并使其成为内联函数。为此,只需在类实现部分中定义函数时使用inline限定符即可。内联函数的特殊规则要求在每个使用它们的文件中都对其进行定义。确保内联定义对多文件程序中的所有文件都可用的最简单的方法是:将内联定义放在定义类的头文件中。

class Stock
{
private:
	void set_tot();	
};
inline void Stock::set_tot()
{
	total_val = shares * share_val;
}

三、方法使用哪个对象
调用成员函数时,它将使用被用来调用它的对象的数据成员。
所创建的每个新对象都有自己的存储空间,用于存储其内部变量和类成员;但同一个类的所有对象共享同一组类方法,即每种方法只有一个副本。
在这里插入图片描述

10.2.4 使用类

// 程序清单10.3 usestock0.cpp--the client program
#include <iostream>
#include "stock00.h"

int main(void)
{
    Stock fluffy_the_cat;
    fluffy_the_cat.acquire("NanoSmart", 20, 12.5);
    fluffy_the_cat.show();
    fluffy_the_cat.buy(15, 18.125);
    fluffy_the_cat.show();
    fluffy_the_cat.sell(400, 20.00);
    fluffy_the_cat.show();
    fluffy_the_cat.buy(300000, 40.125);
    fluffy_the_cat.show();
    fluffy_the_cat.sell(300000, 0.125);
    fluffy_the_cat.show();

    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 第1章《认识java语言》是介绍Java语言的起源、发展以及特点等基本知识。Java是一种跨平台的高级编程语言,被广泛应用于开发Web和移动应用程序等领域。它具有面向对象、可移植、健壮性好等特点。 第2章《Java语言基础》是介绍Java语言的基本语法、数据类型、运算符、控制流程等内容。学习这些基础知识对于理解和编写Java程序至关重要。 第3章《面向对象程序设计之一》是介绍面向对象编程的原理和基本概念。学习面向对象的思想和方法可以提高程序的可扩展性和重用性。本章内容包括类与对象、封装、继承、多态等知识点。 第4章《面向对象程序设计之二》是进一步探讨面向对象编程的高级特性。学习抽象类、接口、内部类等内容可以让我们写出更加灵活和健壮的Java程序。 第5章《Java基础类库》是介绍Java标准库中的常用类和接口。掌握这些类的使用方法可以大大简化程序开发,如字符串处理、集合框架、IO操作等。 第6章《图形用户界面程序》是介绍使用Java编写图形用户界面(GUI)程序的方法。学习Swing和JavaFX等技术可以实现丰富、直观的用户界面。 第7章《输入输出流》是介绍Java中的输入输出操作。学习文件读写、网络通信等知识可以实现数据的持久化和交互。 第8章《多线程并发编程》是介绍Java多线程编程的原理和方法。学习多线程操作可以充分利用多核处理器的优势,提高程序的并发性和响应性。 第9章《网络编程》是介绍使用Java进行网络通信的方法。学习Socket编程、HTTP协议等内容可以开发出基于网络的应用程序。 第10章《数据库编程》是介绍使用Java连接和操作数据库的方法。学习JDBC等技术可以实现与数据库的交互,进行数据持久化和查询。 通过学习这些章节的内容,可以全面掌握Java语言的基础知识和常用技术,为进一步深入学习和应用Java打下良好的基础。 ### 回答2: 第1章:认识Java语言 第1章介绍了Java语言的基本概念和特点。Java是一种跨平台的编程语言,被广泛应用于Web开发、移动应用开发等领域。Java具有简单易学的特点,使用了面向对象的编程思想,具有良好的可扩展性和可维护性。 第2章:Java语言基础 第2章主要介绍了Java语言的基本语法和常用的数据类型。包括变量、常量、运算符、流程控制语句等。同时还介绍了Java中的数组、字符串和输入输出等相关知识。 第3章:面向对象程序设计之一 第3章介绍了面向对象程序设计的基本概念和常用的面向对象的特性。包括类、对象、继承、封装和多态等。同时还介绍了如何定义和使用类,以及如何实现各种面向对象的特性。 第4章:面向对象程序设计之二 第4章进一步深入介绍了面向对象程序设计的相关知识。包括接口、抽象类、继承和多态的高级应用,以及异常处理和内部类等。这些知识对于构建复杂的面向对象程序非常重要。 第5章:Java基础类库 第5章介绍了Java基础类库中常用的类和方法。包括字符串、日期、时间、集合、文件和输入输出等类库的使用。这些类库为我们提供了丰富的功能,在Java编程中非常实用。 第6章:图形用户界面程序 第6章介绍了Java图形用户界面编程的相关知识。包括Swing和AWT等GUI库的使用,以及事件处理和布局管理器等。通过学习这些知识,我们可以编写出漂亮、交互性强的图形界面程序。 第7章:输入输出流 第7章介绍了Java中输入输出流的使用。包括字节流和字符流的概念、File类的使用以及文件读写和网络通信等。这些知识对于实现数据的读写和传输非常重要。 第8章:多线程并发编程 第8章介绍了Java多线程并发编程的相关知识。包括线程、线程同步和线程通信的概念,以及锁和条件的使用。同时还介绍了线程池的概念和使用,以及如何处理并发编程中的常见问题。 第9章:网络编程 第9章介绍了Java网络编程的基本知识。包括Socket编程、TCP和UDP协议,以及HTTP协议的使用。通过学习这些知识,我们可以编写出具有网络功能的Java应用程序。 第10章:数据库编程 第10章介绍了Java数据库编程的相关知识。包括连接数据库、执行SQL语句、事务处理和数据查询等。通过学习这些知识,我们可以使用Java操作各种类型的数据库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值