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();