例6-11 函数指针实例
//例6_11 函数指针实例.cpp(P212)
#include
void printStuff(float) {
cout << \ << endl; }
void printMessage(float data) {
cout << \ << data << endl; }
void printFloat(float data) {
cout << \ << data << endl; }
const float PI = 3.14159f;
const float TWO_PI = PI * 2.0f;
int main() { //主函数
void (*functionPointer)(float); //函数指针 printStuff(PI);
functionPointer = printStuff;
//函数指针指向printStuff
functionPointer(PI); //函数指针调用
functionPointer = printMessage; //函数指针指向printMessage functionPointer(TWO_PI); //函数指针调用 functionPointer(13.0); //函数指针调用 functionPointer = printFloat;
//函数指针指向printFloat
functionPointer(PI); //函数指针调用 printFloat(PI);
return 0; }
运行结果:
6.2.11 对象指针 1.对象指针的一般概念 ● 对象指针定义形式 类名 *对象指针名; ■ 例: Point a(5,10); Piont *ptr; ptr=&a;
● 通过指针访问对象成员 对象指针名->成员名
例:ptr->getx() 相当于 (*ptr).getx(); 例6-12使用指针来访问Point类的成员
//例6_12 使用指针来访问Point类的成员.cpp(P213) #include
class Point {
//类的定义
public: //外部接口
Point(int x = 0, int y = 0) : x(x), y(y) { } //构造函数
int getX() const { return x; } //返回x int getY() const { return y; } //返回y
private: //私有数据 int x, y; };
int main() { //主函数
Point a(4, 5); //定义并初始化对象a
Point *p1 = &a; //定义对象指针,用a的地址将其初始化 cout << p1->getX() << endl; //利用指针访问对象成员 cout << a.getX() << endl; //利用对象名访问对象成员
return 0; }
运行结果:利用指针访问对象成员与利用对象名访问对象成员是一致的
2. this指针
● 指向当前对象自己
● 隐含于类的每一个非静态成员函数中。 ● 指出成员函数所操作的对象。
■ 当通过一个对象调用成员函数时,系统先将该对象的地址赋给this指针,然后调用成员函数,成员函数对对象的数据成员进行操作时,就隐含使用了this指针。 ● 例如:Point类的getX函数中的语句: return x; 相当于:
return this->x;
曾经出现过的错误例子 class Fred; //前向引用声明 class Barney {
Fred x; //错误:类Fred的声明尚不完善
};
class Fred { Barney y; }; 正确的程序
class Fred; //前向引用声明 class Barney { Fred *x; };
class Fred { Barney y; };
一般在软件开发中不会直接用到this指针访问数据成员,有时需要将此对象作为参数传递给某个函数时会使用this指针,亦或是写程序时忘记某个函数名,输入this->后vs2010会提示出所有成员函数。 3. 指向类的非静态成员的指针
类的成员都是变量、对象、函数等,我们同样可以定义存放它们的地址的指针,从而使指针指向对象的成员,通过指针就可以访问对象的成员了。但是通过这种指向成员的指针一样也只能访问公有成员。
声明指向非静态成员的指针的语法形式为:
类型说明符 类名::*指针名;// 声明指向公有数据成员的指针
类型说明符 (类名::*指针名)(形参表);// 声明指向公有成员函数的指针
指向成员的指针也要先声明再赋值,然后才能引用。给指向成员的指针赋值就是要说明此指针指向类的哪一个成员。
为指向数据成员的指针赋值的语法形式为:
指针名 = &类名::数据成员名;
在前面的地址相关运算中,我们知道用“&”运算符可以取到变量的地址,将其赋值给某个指针后就可以通过这个指针访问变量了。但是对于指向类的数据成员的指针就不同了,在类声明时并不会为类的数据成员分配内存空间,所以给指向数据成员的指针赋值只是确定了此指针指向哪个数据成员,同时也在指针中存放了该数据成员相对于类的起始地址的地址偏移量。这时通过赋值后的指针不能访问到具体的数据成员。
在声明了类的对象后就会为对象分配内存,这样根据对象的起始地址和指向数据成员的指针中存放的偏移量就可以访问到对象的数据成员了。通过对象和指向数据成员的指针访问公有数据成员的语法形式为:
对象名.*指向数据成员的指针名
或者
对象指针名->*指向数据成员的指针名
为指向成员函数的指针赋值的语法形式为:
指针名 = &类名::函数成员名;
在上面的形式为成员函数指针赋值以后还不能直接用此指针调用成员函数,必须先声明了类的对象,再通过对象和指向非静态成员函数的指针调用成员函数。调用的语法形式为:
(对象名.*指向成员函数的指针名)(形参表)
或者
(对象指针名->*指向成员函数的指针名)(形参表)
在为成员函数指针赋值时,还有用对象和成员函数指针调用成员函数时,我们都要注意成员函数指针的返回值类型和形参表一定要和指向的成员函数一致。
我们以上面对象指针中6-12 Point类的例子为基础修改下,看看访问对象公有成员函数的几种方式: