对象的创建与使用
在程序中仅有类是远远不够的,仅仅定义一个类没有任何意义,根据类创建出具体的对象投入使用才真正体现了类的“价值”。就像只有汽车的设计图纸并不等于能够驾驶汽车一样,只有通过创建类的实例对象,才能实现具体操作。
对象从创建到使用需要一个过程,下面我们分别介绍对象的创建方法、内存分配情况以及对象的使用。
1、创建对象并分配空间
C++中提供了多种创建对象的方法,最简单方法就是给出类型及变量名,格式如下所示:
类名 对象列表;
就像定义一个int类型变量一样:int a;,a就是int类型的一个对象,按照这样的形式,创建Car类对象的代码如下所示:
Car mycar;
与int型变量的定义过程类似,创建类对象就要给它分配空间,存储对象的成员。通常我们会认为,每个对象都要为自己的数据成员和成员函数分配空间,具体形式如图1所示。
图1 类的对象在内存中的分布
每个对象的数据成员描述的是本对象自身的属性,例如汽车对象,a汽车是红色,b汽车是白色,因此在创建对象时应该为每个对象分配一块独立的内存来存储数据成员值,与C语言中的普通局部变量一样,类中的普通数据成员也被分配在栈中。但是成员函数描述的是对象执行的动作,每个对象都应相同,为每个对象的成员函数也分配不同空间必然造成浪费。C++中用同一段空间存放同类对象的成员函数代码,每个对象调用同一段代码,具体形式如图2所示。
图2 同类对象共用成员函数代码
2、访问对象成员
创建对象的目的是访问成员,操作对象的属性及方法,访问对象成员的语法格式如下所示:
对象名.数据成员名
对象名.成员函数名
访问格式中,“.”称为成员运算符,与struct结构体访问成员的方式一样,C++中访问成员的方式都是通过“.”运算符完成的。例如下述代码定义了一个Car类对象并访问了类中的成员函数:
Car mycar;
mycar.disp_welcomemsg(); //mycar对象访问成员函数
访问成员函数的方法与函数调用形式类似,只是需要使用对象名通过成员运算符访问该函数。
接下来通过一个案例来学习从定义类、创建对象到访问成员的完整过程,如例1所示。
例1
1 #include <iostream>
2 using namespace std;
3
4 class Car //定义类Car
5 {
6 //成员函数
7 public:
8 void disp_welcomemsg(); //声明disp_welcomemsg()函数
9 int get_wheels(); //声明get_wheels()函数
10 void set_wheels(int); //声明set_wheels()函数
11 //数据成员
12 private:
13 int m_nWheels;
14 };
15 void Car::disp_welcomemsg() //类成员函数disp_welcomemsg()的实现
16 {
17 cout << "Welcome to the car world!" << endl;
18 }
19 int Car::get_wheels() //类成员函数get_wheels()的实现,获取车轮数
20 {
21 return m_nWheels;
22 }
23 void Car::set_wheels(int n) //类成员函数set_wheels()实现,设置车轮数
24 {
25 m_nWheels = n;
26 }
27 int main()
28 {
29 Car mycar; //定义类对象mycar
30 mycar.disp_welcomemsg(); //访问成员函数,显示欢迎信息
31 mycar.set_wheels(4); //访问成员函数,设置车轮数量
32 //访问成员函数,显示车轮数量
33 cout << "wheels = " << mycar.get_wheels() << endl;
34 system("pause");
35 return 0;
36 }
运行结果如图3所示。
图3 例1运行结果
在例1中,定义了类Car,main()函数中定义该类对象mycar。代码第30行访问了对象的成员函数disp_welcomemsg(),打印了出了欢迎信息,代码第31行,通过调用set_wheels()函数,将对象的数据成员m_nWheels设置为4,代码第33行调用get_wheels()函数显示了车轮数量,即记录在数据成员m_nWheels中的数值4。