研究生学习生涯之C++面向对象编程
以下来源网络(2019.8.12)
类
1.类的定义
1). 类定义格式
类的定义分为说明和实现两个部分。
类说明部分是用来声明该类中的成员。类的成员包括数据成员和函数成员。其中,函数成员又称成员函数或“方法”,用于对数据成员进行各种操作。
类实现部分用来对成员函数进行定义。即说明部分告诉类要“干什么”,实现部分告诉类“怎么干”。
(1)类的说明部分
类说明部分一般格式如下
class
{
private:
私有数据成员声明或函数成员的原型;
protected:
受保护数据成员声明或函数成员的原型;
public:
公有数据成员声明或函数成员的原型;
};
其中参数说明如下:
class:类说明的关键字。
是用户自定义的C++标识符。
{} 被花括号括起来的部分称为类体。类体主要由一些变量和函数说明组成,分别称为类的数据成员和函数成员,统称为类成员。
(2)类的实现部分
类的实现部分,包括所有在类体中说明的成员函数的定义。成员函数的定义通常在类定义体之外给出,其中每个成员函数定义格式为:
返回值类型 类名∷成员函数名(<参数表>)
{
… //函数体
}
类的成员函数在类外部定义时,前面必须加上“类名∷”,以说明所定义的函数是哪一个类的成员。“∷”称为作用域运算符。
温馨提示:类的实现有两点说明:
类的数据成员需要初始化,成员函数还要添加实现代码。类的数据成员不可以类的声明中初始化。
(3)空类是C++中最简单的类,其声明方式如下: class CPerson{};
空类只是起到占位的作用,需要的时候再定义类成员及实现。
#include<iostream>
using namespace std;
//类定义
class point
{
private:
double x,y;
public:
void SetPoint(double x,double y);
double GetX();
double GetY();
void Print();
};
//类实现
void point::SetPoint(double a,double b)
{x = a,y = b};
double point::GetX()
{return x};
double point::GetY()
{return y};
void point::Print()
{
cout << "x= "<< x <<endl;
cout << "y= "<< y <<endl;
}
2.类的访问控制
1).访问类的成员
类的三大特点之一就是具有封闭性,封闭在类里面的数据可以设置成对外可见或不可见,通过关键字public,private,protected可以设置类中数据成员对外是否可见,也就是其他类是否可以访问该数据成员。C++中,类体被分成以下三类:
公有成员:以关键字public指明。
私有成员:以关键字private指明。
保护成员:以关键字protected指明。
上述的几个关键字被称为访问说明符(access specifier),用来控制相应成员在程序中的可访问性,使得信息封装和模块化的风格更好。访问说明符说明了对该说明符与下一个说明符之间出现的类成员的访问权限。这三种类成员的属性如下:
public属性的成员对外可见,对内可见。
private属性的成员对外不可见,对内可见。
protected属性的成员对外不可见,对内可见,且对派生类是可见的。
说明:如果在类定义的时候没有加任何关键字,默认状态类成员都在private区域。关于类的保护成员的使用,将在后面类的继承部分详细讲解,此外,类的友元可以访问关的任何成员,这也将在后面章节中提到。
2).内联成员函数
在C++语言基础部分,定义内联函数的优点是提高运行时间效率,缺点是增加了空间开销。
对于普通函数,函数调用需要时间和空间开销,调用函数实际上将程序执行流程转移到被调函数中,被调函数的代码执行完后,再返回到调用的地方。这种调用操作要求调用前保护好现场并记忆执行的地址,返回后恢复现场,并按原来保存的地址继续执行。对于较长的函数这种开销可以忽略不计,但对于一些函数体代码很短,又被频繁调用的函数,就不能忽视这种开销。引入内联函数正是为了解决这个问题,提高程序的运行效率。
对于内联函数,在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替换。由于在编译时将内联函数体中的代码替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间开销上不象函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省。
在定义函数时,可以使用inline关键字将函数定义为内联函数。在定义类的成员函数时,也可以使用inline关键字将成员函数定义为内联成员函数。其实,对于成员函数来说,如果其定义是在类体中,即使没有使用inline关键字,该成员函数也被认为是内联成员函数。例如:
class CUser //定义一个CUser类
{
private:
char m_Uswrname[128]; //定义数据成员
char m_Password[128];
public:
inline char* GetUsername() const; //定义一个内联成员函数
};
char* CUser::GetUsername()const //实现内联成员函数
{
return (char*)m_Username;
}
程序中,使用inline关键字将类中的成员函数设置为内联成员函数。此外,也可以在类成员函数的实现部分使用inline关键字标识函数为内联成员函数。例如:
class CUser //定义一个CUser类
{
private:
char m_Uswrname[128]; //定义数据成员
char m_Password[128];
public:
char* GetUsername() const; //定义一个内联成员函数
};
inline char* CUser::GetUsername()const //实现内联成员函数
{
return (char*)m_Username;
}
程序中的代码演示了在何处使用关键字inline。对于内联函数来说,程序会在函数调用的地方直接插入函数代码,如果函数体语句较多,则会导致程序代码膨胀。如果将类的析构函数定义为内联函数,可能会导致潜在的代码膨胀。