C++ Primer Plus书之--C++类 简介

C++中的类

来看一个简单的类的简单声明, 了解下类的基本描述

class World
{
    // 私有变量外界不能直接访问
    // C++中默认为private, 即使不明确写明是private的
    // 类对象的默认访问控制是private.
    float mass;
    char name[20];
    
    public:
        void tellall(void);
        ...
};

类和结构的关系:

类描述看上去很像是包含成员函数以及public和private可见性标签的结构声明. 实际上, C++对结构进行了扩展, 使之具有与类相同的特殊. 他们之间的唯一区别是, 结构的默认访问类型是public的, 而类的默认访问控制为private的.

实现类成员函数:

类成员函数和常规函数定义非常相似, 他们有函数头和函数体, 也可以有返回类型和参数, 但是他们还有两个特殊的特征:

1.定义成员函数时, 使用作用域解析运算符(::)来标识函数所属的类;

2.类方法可以访问类的private组件.

 首先, 成员函数的函数头使用作用域运算符解析(::)来指出函数所属的类, 例如update()成员函数的函数头如下:

void Stock::update(double price)

这表示update()函数是Stock类的成员

怎么调用对象的方法?

Shock kate, joe;
// 调用类的成员函数
kate.show();
joe.show();

所创建的每个新对象都有自己的存储空间, 用于存储其内部变量和类成员: 但同一个类的所有对象共享同一组方法, 即每种方法只有一个副本. 例如: 假设kate和joe都是Stock对象, 则kate.shares将占据一个内存块, 而joe.shares占用另一个内存块, 但kate.show()和joe.show()都调用同一个方法, 也就是说, 他们将执行同一个代码块, 只是将这些代码用于不同的数据.

来看一个完整的例子:

类声明文件, 里面声明了类的私有变量和私有方法, 以及对外暴露的共有方法, 注意其中的set_tot()函数实际是个内联函数

// 类声明文件
// stock00.h
#ifndef STOCK00_H_
#define STOCK00_H_

#include <string>

class Stock
{
    // private可以不写, 因为默认是private的
private:
    std::string company;
    long shares;
    double share_val;
    double total_val;
    // 将函数定义写在类声明中的函数, 都自动成为内联函数
    void set_tot() {total_val = share_val * shares;}
    // 这个就不是内联函数, 因为只有函数的声明, 没有函数的定义.
    void test(double d);

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

#endif

来看第二个文件, 是对应的类声明的函数的定义

// 第二个文件
// stock00.cpp
// 实现Stock类
#include <iostream>
#include "stock00.h"

// 要用类名+:: 函数名来表明是那个类的成员函数
void Stock::acquire(const std::string & co, long n, double pre)
{
    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 = pre;
	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)
{
	using std::cout;
	if(num < 0)
	{
		cout << "Number of shares sold can't be negative Transaction is aborted " << std::endl;
	} else if(num > shares){
		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 << " Shares: " << shares << std::endl;
	std::cout << " Share Price: $" << share_val << "Total Worth: $" << total_val << std::endl;
}

void test(double d)
{
	std::cout << d << std::endl;
}

第三个文件, 是对类的操作:

// 第三个文件, 调用Stock类, 使用类方法
// usestock0.cpp
// compile with stock00.cpp
#include <iostream>
#include "stock00.h"

int main()
{
	Stock fluffy_the_cat;
	fluffy_the_cat.acquire("NanoSmart", 20, 12.50);
	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;
}

程序运行结果为:

C++中使用类的步骤如下:

1.类声明, 格式如下:

class className
{
private:
	// 成员变量
	// 即使不用private , 默认也都是private的, 也就是只能通过类成员函数进行访问
	data member declarations
public:
	// 成员函数的函数原型
	member function prototypes;
}

2.实现类成员函数

可以在类声明中提供完整的函数定义(如果提供了完整的函数定义, 则函数默认会是内联函数), 而不,是函数原型, 但是通常的做饭是单独提供函数定义(除非函数很小). 单独提供函数定义的时候, 需要使用域解析运算符来指出成员函数属于哪个类. 例如:  

char* Bozo::Retort()

{

...

}

这个函数定义指明Retort()函数是Bozo类的一个成员函数, 返回值是char*,

3.调用类的成员函数:

cout << Bozetta.Retort();

猜你喜欢

转载自blog.csdn.net/c1392851600/article/details/84930191