C++_类和对象 (2)

内联函数在调用时不是像一般函数那样要转去执行被调用函数的函数体,执行完成后再转回调用函数中,执行其后语句,而是在调用函数处用内联函数体的代码来替换,这样将会节省调用开销,提高运行速度。

内联函数与带参数的宏定义进行一下比较,它们的代码效率是一样的,但是内联函数要优于宏定义,因为内联函数遵循函数的类型和作用域规则,它与一般函数更相近,在一些编译器中,一旦关上内联扩展,将与一般函数一样进行调用,调试比较方便。

外联函数变成内联函数的方法很简单,只要在函
数头前面加上关键字inline就可以了。

2.2 将成员函数以内联函数的形式进行说明

有两种格式将成员函数声明为类的内联函数:

(1)隐式声明 直接将函数声明在类内部。

class Coord{ public: void setCoord(int a,int b) { x=a; y=b;} int getx() { return x;} int gety() { retrun y;} private: int x,y; };

(2)显式声明

在类声明中只给出成员函数的原型,而成员函数体写在类的外部。为了使它起内联函数的作用,在成员函数返回类型前冠以关键字“inline”。

这种成员函数在类外定义的一般形式是:

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

class Coord{ public: void setCoord(int,int); int getx(); int gety(); private: int x,y; }; inline void Coord::setCoord(int a,int b) { x=a; y=b;} inline int Coord::getx(){ return x;} inline int Coord::gety(){ return y; } 说明

(1)使用inline说明内联函数时,必须使函数体和inline说明结合在一起,否则编译器将它作为普通函数处理。

inline void Coord:: setCoord(int ,int); // 不能说明这是一个内联函数

(2) 通常只有较短的成员函数才定义为内联函数,对较长的成员函数最好作为一般函数处理。

class Date{ public: void showDate(); private: int year; int month; int day; }; inline void Date::showDate() {cout<<year<<'.';<<month<<'.'<<day<<endl;} 3. 对象的定义和使用 类与对象的关系

通常我们把具有共同属性和行为的事物所构成的集合叫做

在C++中,可以把相同数据结构相同操作集对象看成属于同一类。

在C++中,类也是一种用户自定义数据类型,类的对象可以看成是该类类型的一个实例,定义一个对象和定义一个变量相似。类与对象间的关系,可以用数据类型int和整型变量i之间的关系类比。

C++把类的变量叫做类的对象,对象也称为类的实例。

3.1 对象的定义

对象的定义, 也称对象的创建

在C++中可以用以下两种方法定义对象:

(1) 在声明类的同时,直接定义对象。 class Coord { public: void setCoord(int,int); int getx(); int gety(); private: int x,y; } op1,op2; (2) 声明了类之后,在使用时再定义对象 class Coord { //… }; // … main() { Coord op1,op2; // … } 说明:

在声明类的同时定义的对象是一种全局对象,在它的生存期内任何函数都可以使用它。

声明了一个类便声明了一种类型,它并不接收和存储具体的值,只作为生成具体对象的一种“样板”,只有定义了对象后,系统才为对象分配存储空间。

3.2 对象中成员的访问

当定义了一个类的对象后,就可以访问对象的成员了。在类的外部可以通过类的对象对公有成员进行访问,访问对象成员要使用操作符“.”。

访问的一般形式是:

对象名.数据成员名

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

其中“.”叫做对象选择符,简称点运算符

例2.2 使用类Coord的完整程序 #include<iostream.h> class Coord { public: void setCoord(int a,int b) { x=a; y=b; } int getx() { return x; } int gety() { return y; } private: int x,y; }; void main() { Coord op1,op2; int i,j; op1.setCoord(5,6); // 调用op1的setCoord(),初始化对象op1 op2.setCoord(7,8); // 调用op2的setCoord(),初始化对象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; } 说明:

对象名.成员名实际上是一种缩写形式,它表
达的意义是:对象名.类名::成员名

void main( ) { Date date1; date1.setDate(2006,9,21); //…… }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzfjf.html