1 . 类与对象的关系
通常我们把具有同样性质和功能的东西所构成的集合称为类。在C++中,可以把相同内部存储结构和相同操作集的对象看成属于同一类。
在C++中,对象是类的实际变量。类与对象间的关系,可以用整型 int 和整型变量 i 之间的关系来类比。类和整型 int 均代表的是一般的概念,而对象和整型变量 i 却是代表 具体的东西。正像定义 int 类型的变量一样,也可以定义类的变量。C++把类的变量称为类的对象,对象也称为类的实例。
2 . 对象的定义
可以用以下两种方法定义对象。
(1)在声明类的同时,直接定义对象,即在声明类的右花括号“}”后,直接写出属于该 类的对象名表。例如:
class point
{
private :
int x, y;
public:
void setpoint(int, int) ;
int getx( ) ;
int gety( ) ;
} op1, op2;
在声明类 point 的同时,直接定义了对象 op1 和 op2,这时定义的是一个全局对象。
( 2 ) 声明了类之后,在使用时再定义对象, 定义的格式与一般变量的定义格式相同,如下所示:
point op1 ,op2;
此时定义了 op1 和 op2 为 point 类的两个对象。
说明:
(1) 声明了一个类便声明了一种类型,它并不接收和存储具体的值,只作为生成具体对象的一种“样板”,只有定义了对象后,系统才为对象并且只为对象分配存储空间。
(2)在声明类的同时定义的对象是一种全局对象,在它的生存期内任何函数都可以使用它。但有时使用它的函数只在极短的时间对它进行操作,而它却总是存在,直到整个程序运行结束,采用使用时再定义对象的方法可以消除这种弊端。
3.对象的引用
在此,对象的引用是指对对象成员的引用。不论是数据成员,还是成员函数,只要是公有的,就可以被外部函数直接引用,引用格式是:
对象名.数据成员名
或
对象名.成员函数名( 实参表)
其中“.”叫做对象选择符,简称点运算符。
下面的例子中定义了 point 类的两个对象 op1 和 op2,并引用这两个对象的成员进行 了一些操作。
# include <iostream.h>
class point
{
private:
int x, y;
public:
void setpoint(int a, int b)
{
x = a ; y = b;
}
int getx ( )
{
return x;
}
int gety( )
{
return y;
}
} ;
void main ( )
{
point op1, op2;
int i, j;
op1.setpoint(1, 2 ) ; // 调用op1的 setpoint( ),初始化对象op1
op2.setpoint(3, 4 ) ; // 调用op2的setpoint( ),初始化对象op2
i = op1.getx( ) ; // 调用 op1 的 getx( ),取op1的x值
j = op1.gety( ) ; // 调用 op1 的 gety( ),取op1的y值
cout << "op1 i = ”" << i << "op1 j = " << j << endl;
i = op2.getx( ) ; // 调用op2的getx( ),取op2的x值
j = op2.gety( ) ; // 调用op2的gety( ),取op2的y值
cout << "op2 i = " << i << "op2 j = " << j << endl;
}
程序运行结果如下:
op1 i = 1 op2 j = 2
op2 i = 3 op2 j = 4
说明:
(1)本例中 op1.setpoint( 1, 2) 实际上是一种缩写形式,它表达的意义是 op1.point∷ setpoint( 1, 2),这两种表达式是等价的。
(2)外部函数不能引用对象的私有成员。如果将例 3.3中的主程序改成下面的形式:
void main( )
{
point op;
int i, j;
op.setpoint( 1, 2) ;
i = op.x; // 错误, 不能直接引用对象的私有成员
j = op.y; // 错误, 不能直接引用对象的私有成员
cout << "op x = " << i << "op y = " << j << endl;
}
则编译这个程序时,编译器将指示这两条语句的错误。这时可将这两条错误语句改成调用公有的成员函数来获得私有数据成员 x 和 y 的值,如下所示:
i = op.getx( ) ;
j = op.gety( ) ;
修改后,程序运行结果如下:
op x = 1 op y = 2
( 3 ) 在定义对象时,若我们定义的是指向此对象的指针,则访问此对象的成员时,不 能用“.”操作符,而应使用“ - > ”操作符,例如:
void main( )
{
point * op;
op -> setpoint( 1, 2) ;
// …
}
4 . 对象赋值语句
如果有两个整型变量 x 和 y,那么用 y = x,就可以把 x 的值赋给 y。同类型的对象之间也可以进行赋值,当一个对象赋值给另一个对象时,所有的数据成员都会逐位拷贝。例如, A 和 B 是同一类的两个对象,假设 A 已经存在,那么下述对象赋值语句把对象 A 的值逐位拷贝给对象 B:
B = A
下面我们看一个使用对象赋值语句的例子。
# include <iostream.h>
class myclass
{
int a , b;
public:
void set( int i, int j)
{
a = i;
b = j;
}
void show( )
{
cout << a << " " << b << endl;
}
};
main ( )
{
myclass o1, o2;
o1.set(20, 5);
o2 = o1; // 将对象 o1 的值赋给对象 o2
o1.show( );
o2.show( );
return 0;
}
在该程序中,语句:
o2 = o1;
等价于语句::
o2.a = o1.a;
o2.b = o1.b;
因此,运行此程序将显示:
20 5
20 5
说明:
(1) 在使用对象赋值语句进行对象赋值时,两个对象的类型必须相同,如对象的类型不同,编译时将出错。
(2)两个对象之间的赋值,仅仅使这些对象中数据相同,而两个对象仍是分离的。例 如本例对象赋值后,再调用 o1.set( ) 设置 o1 的值,不会影响 o2 的值。
(3)将一个对象的值赋给另一个对象时,多数情况下都是成功的,但当类中存在指针时,可能会产生错误。