OOP特性:
- 抽象
- 封装和数据隐藏
- 多态
- 继承
- 代码的可重用性
类定义和实现
C++使用class关键字定义类:
class Stock
{
public:
void update(double price);
int GetA(){return m_A;}
private:
int m_A;
};
类中的默认的访问控制权限是private,标识只能通过公共成员访问的类成员,往往用来标识数据和内部使用的方法。public是公有的标识。
实现类中方法时,使用::作用域解析符,类中方法可访问private成员,比如其中一个类方法的函数头:
void Stock::update(double price)
如果函数定义在类定义中,那么这个函数就是一个内联函数,比如Stock::GetA()
。常将短小的成员函数作为内联函数。如果要将内联函数在类定义外定义,则函数原型加上inline关键字。
构造函数和析构函数
应为类提供构造函数和析构函数。构造函数与类名同名:
class Stock
{
public:
Stock(const string& co, long n = 0, double pr = 0.0);
};
注意,构造函数中的形参名不能和类成员数据名相同,否则会造成混乱错误。我们往往使用m_
前缀。
创建对象时可以显式的调用构造方法:
Stock food = Stock("World Cabbage", 250, 1.25);
也可以隐式的调用:
Stock garment("Funny Mason", 50, 2.5);
创建类对象时也可以使用new来动态分配内存:
Stock *pstock = new Stock("Electroshock Games", 18, 19.0);
如果没有提供构造函数,C++会使用默认的空构造函数:
Stock fluffy_the_cat; //uses:Stock::Stock(){}
注意,必须是没有提供任何自定义的构造函数,才会自动创建默认构造函数。
用构造函数创建对象后,程序会跟踪该对象,当对象过期时,程序会自动调用析构函数来清理对象的内存。例如,如果构造函数使用new分配内存,则析构函数使用delete来释放内存。如果没有使用new,则创建一个空析构函数即可。
析构函数的名称为~
类名:
~Stock();
成员函数定义时,可以在末尾使用const关键字:
void show() const;
void Stock::show() const{}
这里的const关键字意义是保证函数不会修改对象,这种函数称为const成员函数。
this指针
this指针指向用来调用成员函数的对象,即当前对象本身。所有的类方法将this指针设置为调用它的对象的地址。每个成员函数都有一个this指针,如果要引用整个调用对象,可以使用*this
。
类作用域
在类中定义的名称的作用域都为整个类。要调用公有成员函数,也必须通过对象。
类中无法直接定义符号常量:
class Bakery
{
private:
const int Months = 12; //invalid
};
因为类只是描述了对象的形式,并没有创建对象,所以在对象创建前,没有用于存储的空间。
不过可以使用枚举来实现:
class Bakery
{
private:
enum {Months = 12}; //invalid
};
但这并不是成员数据,只是在遇到Months时会用12代替。
还可以使用static来定义符号常量:
class Bakery
{
private:
static const int = 12; //invalid
};
这样的话常量就定义在类中,其它静态变量存储在一起,与而不是存储在对象中。
传统的枚举会有冲突,比如两个枚举都有相同的某个值,并在同一作用域内,就会发生冲突:
enum egg{Small};
enum t_shirt{Small}; //冲突
C++提供了新的枚举类,作用域为类:
enum class egg {Small};
enum class t_shirt {Small};
可以这么用:
egg choice = egg::Small;
t_shirt Floyd = t_shirt::Small;
网友评论