类和对象

70 阅读4分钟

类与对象

1 类和对象的说明

一个类实际上是一种用户定义的数据类型,而对象即相当于这个数据类型的变量,对变量的常规操作同样适用于对象

1.1 类的说明

类,可以当作一种数据类型

calss 自定义类型名
{
  private: 各私有成员说明 -> 一般为数据成员
  protect: 各保护成员说明 
  public:  各共有成员说明 -> 一般为函数成员
           构造函数(有参、无参)析构函数 拷贝构造 其他功能函数 
};  //注意这末尾的分号

1.2 对象的说明

对象,与其他数据类型的变量类似,可以说明其数组、指针等

类名 对象名1(实参表1),···,对象名n(实参表n);  //创建类的实例
对象名.成员名   //调用对象的成员

1.3 this 指针

类的定义中,对类成员的直接访问或使用均隐含解释为对 “当前对象” 的成员进行访问或使用,this 指针为系统提供的专用指针,总是指向当前对象

2 构造函数与析构函数

2.1 构造函数

当类的数据成员中含有指针类型成员时,建议定义一个拷贝构造函数进行深拷贝,避免在析构时产生错误

类名(){}    //默认无参构造函数(当未说明构造函数时系统自动提供)
类名(参数表){具体实现};   //默认含参构造函数   
           //当参数表中只有一个形参且为本类对象时,说明为拷贝构造函数

2.2 析构函数

~ 类名(){ 具体实现 -> 用 delete 函数释放动态对象 }

3 类与对象的其他特征

3.1 类的静态成员

类的静态成员为所有对象共享,不管有多少对象,静态成员只有一份存于公用内存之中,可以通过类的对象进行调用,也可以通过类名限定符进行调用

  • 静态数据成员
Static float xcoord;   //类内 形式化说明,还需在类外进行实体化说明
float Point:: xcoord = 5;   //类外实体化说明
  • 静态函数成员

没有this 指针,一般情况下只处理类的静态数据成员值(只隶属于类而不属于任何一个特定的对象)

3.2 类的常量成员

  • 常量数据成员

在成员说明时不能被赋值,只能在对象被说明时通过构造函数的成员初始化列表的方式来进行赋值

常量数据成员为每一个对象所持有,不同的对象可以有不同的值,一旦对象被创建,其常量数据成员的值就不允许被修改

const int c1;   //常量数据成员的说明
CC(int a): c1(a){···};  //通过成员初始化列表进行赋值
  • 常量函数成员

只有权读取相应对象的内容,无权修改

int readme() const {return me;};   //注意 const 要加载函数说明的尾部!

4 友元与类的关系

类的私有成员不允许外部程序访问,但 C++ 中又允许少量函数或类享有特权,作为友元可以访问它们

4.1 友元函数与友元类

class A
{
  ···
  friend int f (int a){···};   //友元函数
  friend class B;              //友元类
  ···
}

友元函数 f 不是类A的函数成员,但有权访问 A 的所有私有和保护成员,其定义可以在类 A 内,也可以在类 A 外

友元类 B 的任一函数都有权访问和调用类 A 的所有成员,类 B 要在类外说明

友元的关系是单向的,若类 B 是类 A 的友元,并不意味着类 A 是类 B 的友元

友元的关系是不传递的,若类 B 是类 A 的友元,类 C 是类 B 的友元,并不意味着类 C 也是类 A 的友元

4.2 类与类之间的关系

  • 一个类的对象作为另一个类的成员
//类 line 中有成员 startend, 需用成员初始化符表进行初始化
line(int sx,int sy,int ex,int ey, int col):start(sx,sy),end(ex,ey){···}; 
//先完成各对象成员的初始化工作,而后执行本类的构造函数体,析构函数调用的顺序相反
  • 一个类定义在另一个类的说明中,即类的嵌套
class CC{ publicclass C1{···};}; //在 CC 类外使用 C1 时,类名应为 CC::C1  
  • 一个类作为另一个类的友元
  • 一个类作为另一个类的派生类

5 运算符重载用于用户定义类型

在类内说明运算符重载函数时,默认参数表中含有本类对象,故如重载双目运算符,参数表中只含有一个参数即可

//返回值类型 operator 运算符 (参数表) {···};

本文使用 markdown.com.cn 排版