在C++中通过类来定义自己的抽象数据类型,数据抽象能够隐藏类对象的内部表示,同时任然允许执行对象的公有操作。这里涉及类的一些最基本的主题:类作用域,构造函数,this指针,友元,可变成员和static成员。
1.类的定义和声明。
简单来说,类就是定义了一个新的类型和一个新的作用域。
类成员包括数据成员,成员函数,类型别名。
将关键字const加到成员函数形参表之后,就可以将成员函数声明为常量:
double AvgPrice()const;
const成员函数不能改变该对象之数据成员。且const关键字必须同时出现在申明和定义中。
可以声明一个类而不定义它:
class MyScreen; //声明类
在声明之后,定义之前,类MyScreen是个不完全类型。不完全类型只能以有限方式使用,不能定义不完全类型对象,只能用于指向该类型的指针或引用,或者用于使用该类型的形参或返回类型的函数声明。
类一般在头文件中进行定义,定义类不会分配存储空间,只有定义类对象才会分配存储空间。
2.this指针
类的非static成员函数有一个附加的隐含参数,一个指向该对象的this指针,当类的成员函数需要返还*this时,需要考虑是否将成员函数定义为const,我们甚至可以对成员函数基于const而进行重载:
MyScreen screen(5,3);
MyScreen screenCon(5,3);
screen.set('#').display(); //非const版本的display
screenCon.display(); //const版本的display
3.类作用域
一般的,数据成员和成员函数使用对象成员访问操作符来访问,类型别名使用类作用域来访问,在类定义外部定义成员函数时,需要添加类作用域,且,函数返回类型不在类作用域中,形参和函数体在类作用域中。
4.构造函数
构造函数分为2个阶段,形参列表完成初始化,函数体完成计算语句,const数据成员,应用类型数据成员,没有默认构造函数的类类型数据成员,必须只能在形参列表中进行初始化。
类通常应定义一个默认构造函数。
explicit关键字可以防止隐式类类型转换。本章参考例子:
#include "MyScreen.h"
MyScreen::MyScreen(void)
{
}
MyScreen::~MyScreen(void)
{
}
char MyScreen::Get()const
{
return m_strContents[m_Cursor];
}
char MyScreen::Get(Index ht,Index wd)const
{
return m_strContents[ht*m_Width + wd];
}
MyScreen::Index MyScreen::GetCursor()const
{
return m_Cursor;
}
MyScreen &MyScreen::Set(char ch)
{
m_strContents[m_Cursor] = ch;
return *this;
}
MyScreen &MyScreen::Set(Index ht, Index wd,char ch)
{
m_strContents[ht*m_Width + wd] = ch;
return *this;
}
MyScreen &MyScreen::Move(Index ht,Index wd)
{
m_Cursor = ht *m_Width + wd;
return *this;
}
MyScreen &MyScreen::Display(std::ostream &os)
{
os << m_strContents;
return *this;
}
const MyScreen &MyScreen::Display(std::ostream &os)const
{
os << m_strContents;
return *this;
}