C++ 类详解

本文旨在让读者了解类的基础知识,如何声明类、定义类、使用类以及封装的概念。

类规范由两部分构成:
1、类声明:以数据成员的方式描述数据部分,以成员函数(被称为方法)的方式描述公有接口。
2、类方法定义:描述如何实现类成员函数。
也可以理解为类的声明提供类的蓝图,方法定义则提供了细节。在C++程序中,要使用某个类,必须了解该类的公共接口;要编写类,必须创建类的公共接口。

对类成员的访问控制由publuic private protected三个关键字控制。类对象的程序可以直接访问public修饰的公有部分,但只能通过公有成员函数来访问对象的私有成员(private修饰的部分)。
在设计类时尽可能将公有接口与实现细节分开。公有接口表示设计的抽象组件。下面介绍封装的4种情形:
1、将实现细节放在一起并将它们与抽象分开被称为封装。
2、数据隐藏(将数据放在类的私有部分中)是一种封装。
3、将实现的细节隐藏在私有部分也是一种封装。
4、将类函数的定义和类声明放在不同的文件中也是封装的一种。

无论类成员是数据成员还是成员函数,都可以在类的公有部分或私有部分中声明它。隐藏数据是OOP主要的目标之一,因此数据项通常放在私有部分,组成类接口的成员哈桑农户过户放在公有部分,以便在程序中能够调用类的成员函数。
类的私有成员可以显式的使用private关键字修饰,也可以省略private关键字,类的默认访问控制为private。面试中常被问到C++类和结构体的区别,实际上C++对结构进行了扩展,使之具有与类相同的特性。它们之间唯一的区别是,结构的默认访问类型是public,而类为private。典型的类声明格式如下:

class className
{
private:
     data member declarations
public:
     member function prototypes
};

关于类对象的内存使用情况:类创建的每个新对象都有自己的存储空间,用于存储其内部变量和类成员;但同一个类的所有对象共享同一组类方法,即每种方法只有一个副本。加入kate和joe都是Stock类的对象,则kate.shares占用一个内存块,joe.shares占用另一个内存块。但是kate.show()和joe.show()都是调用的同一块代码,执行的同一个方法。如下图所示:
在这里插入图片描述

以股票Stock类为例进行详细讲解
Stock00.h

//stock00.h--Stock class interface
//version 00
#pragma once //预编译方式避免头文件重复包含
//#ifndef STOCK00_H_	//宏方式避免头文件重复包含
//#define STOCK00_H_
//注:避免重复包含头文件有上述两种方式,使用其中一种即可
#include <string>

class Stock//class declaration
{
private://Stock类的私有部分。类的公有成员函数可使用私有部分内容
	std::string company;
	long shares =0;
	double share_val = 0;
	double total_val = 0;
	//私有成员函数,类外不可使用,类的成员函数可以使用
	void set_tot() { total_val = shares * share_val; }
public://Stock类的公有部分
	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();
};	//note semicolon at the end

//#endif // !STOCK00_H

Stock00.cpp

//stock00.cpp--implementing the Stock class
//version 00
#include <iostream>
#include "Stock00.h"
//定义函数时,使用作用域解析运算符(::)来标识函数的所属类
//类方法可以使用类的私有成员
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.\n";
		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.\n";
	}
	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.\n";
	}
	else if(num > shares)
	{
		cout << "You can't sell more than you have! "
			<< "Transaction is aborted.\n";
	}
	else
	{
		shares -= num;
		share_val = price;
		set_tot();
	}
}
void Stock::update(double price)
{
	share_val = price;
	set_tot();
}
void Stock::show()
{
	using std::cout;
	using std::ios_base;
	
	//set format to #.### 使显示结果更加规整
	ios_base::fmtflags orig = cout.setf(ios_base::fixed, ios_base::floatfield);
	std::streamsize prec = cout.precision(3);
	std::cout << "Company: " << company
		<< " Shares: " << shares;
	cout << " Share Price: $" << share_val;
	
	//set format to #.##
	cout.precision(2);
	cout << " Total Worth :$" << total_val << '\n';
	
	//restore original format
	cout.setf(orig, ios_base::floatfield);
	cout.precision(prec);
}

usestock.cpp

//usestock.cpp--the client program
//compile with stock00.cpp
#include <iostream>
#include "Stock00.h"

int main()
{
  //声明一个Stock类的对象
	Stock fluffy_th_cat;
	//通过对象fluffy_th_cat调用类的成员函数
	fluffy_th_cat.acquire("NanoSmart", 20, 12.50);
	fluffy_th_cat.show();
	fluffy_th_cat.buy(15, 18.125);
	fluffy_th_cat.show();
	fluffy_th_cat.sell(400, 20.00);
	fluffy_th_cat.show();
	fluffy_th_cat.buy(300000, 40.125);
	fluffy_th_cat.show();
	fluffy_th_cat.sell(300000, 0.125);
	fluffy_th_cat.show();
	return 0;
}

运行结果
在这里插入图片描述注:代码来自《C++ Primer Plus》的 10.2抽象和类部分。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值