C++面向对象学习之路(一)类与对象

1.1类的定义

面向对象的程序设计有三个主要特征封装 继承 多态。封装是将数据和代码捆绑在一起。在C++中封装通过类来实现。类是一种新的数据结构,也是实现抽象类型的工具。在C语言中,可以通过结构体将相关数据组合在一起;C++中,类是对一组具有共同属性特征和行为特征的对象的抽象。(例如,水果可以是一个类,水果就是苹果、梨等实物的抽象。水果的形状,颜色等都是它的属性,水果可以出售则是它的行为特征)。类就是将相关数据和对这些数据的操作(函数)组合在一起。 类可以看作是对结构体的扩展。


1.1.1类定义格式

class 类名
{
private:
数据成员或成员函数;
protected:
数据成员或成员函数;
public:
数据成员或成员函数;
};

  • 类名
    class是声明类的关键字,类名是标识符(你起的名字,名字尽量符合类所代表的概念),且在它的作用域内必须唯一,不能重名。标识符以字母(大小写均可)或下划线开头,后面跟0或多个由字母、数字字符或下划线组成的字符串。类名的首字符通常采用大写字母。
  • 成员说明
    类的成员包括两类成员,一类是代表对象属性的数据成员,另一类是实现对象行为的成员函数,成员函数的定义可以与声明同时在类内完成,也可以在类外完成。如果在类外完成,则必须用“::”符号告诉编译系统该函数所属的类。
  • 访问权符
    访问权符也称为访问权限符或访问控制符,它规定类中说明的成员的访问属性。是C++语言实现封装的基本手段。C++语言规定,在一个访问权限符后面说明的所有成员都具有由这个访问权限符所规定的访问属性,直到另一个不同的访问权符出现为止。

public(公有类型):声明该成员为公有成员。表示该成员可以被和该类对象对象处在同一作用域内的任何函数使用。一般将成员函数声明为公有的访问控制。`

private(私有类型):声明该成员为私有成员。表示该成员只能被它所在类中的成员函数及该类的友元函数使用。

protected(保护类型):声明该成员为保护成员。表示该成员只能被它所在的类及从该类派生的子类的成员函数及友元函数使用。

在具体使用访问权符时,应根据成员的使用特点决定对其的封装程度。通常将数据成员声明为私有或保护的,将对象向外界提供的接口或服务声明为公有的成员函数。如果某些数据成员在子类中也需要经常使用,则应该把这些数据的访问属性声明为保护类型。

【例1-1】声明一个水果类

class Fruit {
private:                                 //访问权限:私有成员
 char shape[20], field[10], specious[30];//属性,数据成员
 float price;                            //属性,数据成员
public:                                  //访问权限:公有成员
 void Input();                           //行为,成员函数的原型声明,表示输入图书信息
 void Print();                           //行为,成员函数的原型声明,表示输出图书信息
};

说明:

  • 类声明中private,protected和public关键字可以按任意顺序出现。默认是的访问权限为私有的
  • 对于一个具体的类,类声明中的private,protected和public三个部分不一定全都要有,但至少应该有其中一个部分。
  • 数据成员可以是任何数据类型,但不能是自动(auto),寄存器(register)或外部(extern)类型进行说明。
  • 类是一种数据类型,系统不会为其分配内存空间,所以不能再类声明中给数据成员函数赋初值。
  • 类定义必须以“;”结束。

1.1.2成员函数的定义

成员函数的定义有两种形式。第一种是对于代码较少的成员函数,可以直接在类中定义。第二种是对于代码较多的成员函数,通常只是在类中进行原型声明,在类外对函数进行定义,这种成员函数定义的一般形式是:

返回类型 类名 : : 函数名(参数表){
//函数体
}

void Fruit::Input()    //定义成员函数Input()
{
 cin >> shape >> field >> specious>> price;    //输入形状、产地、种类和价格
}
void Fruit::Print()	//定义成员函数Print()
{
 count << shape << " " << field << " " << specious << " " << price << endl;	//输出形状、产地、种类和价格
}

说明:

  • 如果在类外定义成员函数,则应该在所定义的成员函数名前加上类名,在类名和函数名之间应加上作用域运算符“::”,它说明成员函数属于哪个类。例如,上例中“void Fruit::Input()”,表示成员函数Input是Fruit类中的函数。
  • 在定义成员函数时,对函数所带的参数,不但要说明它的类型,还要指出其参数名。
  • 在定义成员函数时,其返回类型一定要与函数原型声明的返回类型匹配。

1.2对象的定义与使用

在C++中,声明了类,只是定义了一种新的数据类型,只有定义了类的对象,才真正创建了这种数据结构的物理实体。(例如,梨,苹果是水果类的实体,称之为对象)对象是类的实际变量,一个具体的对象是类的一个实例。

1.2.1对象的定义

两种方法定义对象

  • 在声明类的同时直接定义对象,例如:

class Fruit {
private:
char shape[20], field[10], specious[30];
float price;
public:
void Input();
void Print();
}apple,pear;//表示定义apple、pear是Fruit的对象

  • 先声明类,然后在使用的时候再定义对象,定义的格式与一般变量定义格式相同。

类名 对象名列表;

例如,Fruit apple,pear;

说明:

  • 必须声明类以后,才能定义类的对象。多个对象之间用逗好分隔。
  • 声明了一个类就声明了一种类型,它并不能接收和储存具体的值,只能作为生成具体对象的一种“样板”,只有定义了对象之后,系统才会为对象并且只为对象分配储存空间。
  • 在声明类的同时定义的对象是一种全局对象,在它的生存期内任何函数都可以使用它,一直到整个程序运行结束。

1.2.2对象的使用

使用对象就是向对象发送消息,请求执行它的某个方法,从而向外界提供所要求的的服务。形式如下:

对象名.成员函数名(实参表);

Fruit apple;
apple.Input(); //通过apple执行输入操作
apple.Output(); //通过apple执行输入操作

1.2.3对象的赋值

同类型的变量,如整型,实型,结构体类型等变量,可以利用赋值操作符“=”进行赋值,对于同类型的对象也同样使用。也就是说,同类型的对象之间可以进行赋值,这种赋值默认通过成员复制进行。当对象进行赋值时,对象的每一个成员逐一复制(赋值)给另一个对象的同一成员。

(上述方法十分的冗余,并没有很好的表现出C++相较于C的优越性,故在此不进行过多的介绍,下节将讲述构造函数,更加方便了对象的初始化工作。)

有关对象赋值的几点注意:

  • 在使用对象赋值语句进行赋值时,两个对象的类型必须相同。赋值兼容规则除外。
  • 两个对象间的赋值,仅仅使这些对象中的数据相同,而两个对象仍然是彼此独立的,各自有自己的内存空间,
  • 如果类中存在指针,则不能简单地将一个对象赋值给另一个对象,否则可能会产生错误。后续将会介绍这些问题及解决办法。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值