您的位置:学习中国 推荐教程 C++C语言 正文
原作者:kuku 添加时间:2007-06-02 原文发表:2007-06-02 人气:22 来源:互联网

本文章共4898字,分4页,当前第3页,快速翻页:
 
-----------------------------------------------------------------------------------------------------------------------------------------------

本文提示:《c语言中的指针专题(3)》是本站编辑们为广大网友精选的实用文章,本文阐述了关于文章的相关理论,相对来说专业性强,但是本文只是针对于某个问题提出的见解与论述,未必能辐射到相关问题的方方面面,所以本文处理问题的方法仅仅为您提供一些参考。更多问题请查阅学习中国网其他栏目哦.

-----------------------------------------------------------------------------------------------------------------------------------------------



下面是一个函数指针的例子:

 

int (*p)(int I,int j);

 

不能是

int *p(int I,int j),

这样就变成了返回指针的函数声明了。

在C++中处于对安全性的考虑,指针和它指向的对象要类型一致,也就说上面的指针所指向的函数的特性要和它一模一样:例如指向int min(int I,int j);是可以的。但是指向int min(double I ,double j);是不可以。函数指针也和其他的指针一样,在使用的时候很怕发生"悬空",所以在使用的时候同样要判断有效性,或者在定义的时候就初始化。

int (*p)(int I,int j)=min; int (*p)(int I,int j)=&min; int (*p)(int I,int j)=0;

B) 函数的指针参数
  函数指针可以作函数的参数:例如我们有一个积分的算法,对于不同的数学函数可以进行积分(我们这里假设函数都是一元的);
那么我们的算法接口可以定义为:

templateT integrate( T lower, T upper , T (*)(T)=0 )throw(integrated_exp);

这里的最后的参数是一个函数的指针,并且被设定缺省值为0。这个函数返回一个值,同时需要一个参数。假如加入我们有这样的一个函数:

double line(double x){ return a*x+b;}

那么我就可以使用了。

函数指针还可以作为返回类型(注意不是函数!!,某个特定的函数是不可以作为返回类型的。)假设:

typedef int (*PF)(int ); PF getProcessMethod( );//true

C) 返回指针的函数
  一个函数的返回是函数的重要接口之一,c++的一个重要的强大的功能就是能够设计足够复杂和好用的用户自定义类型。而同时处理和传递这些类型也是很麻烦的一件事情,我们不想把我们的时间都花在这些对于我们的实际工作没有很实质帮助的拷贝上,解决这个问题就要依赖我们的接口设计:c和c++都提供了相应的解决方案,在c++中我们可是使用引用,讲他们作为函数的实际参数,或者我们在函数的实际参数中使用一个指针等。同样我们还可以使用一个函数返回一个指针:但是这是一个很不好解决的问题!
我们首先容易出错的是:将一个局部变量的地址传出来!例如:

UserType * Process( ) {   UserType ut(param-list);   //process ut;   return &ut;// }

这个变量在我们的函数结束的时候就被销毁了,尽管地址可以传出去,但是这个地址已经不存在了,已经不能使用的东西,在这个函数之外却不知道,难免要出错!
同时我还会有一个比较麻烦的问题:使用new,又容易造成内存泄露

UserType * Process ( ) {   UserTpye *put=new UserType(param-list );   //process put;   return put; }

我们在函数内部使用了一个new,分配了一个空间,这样传出来也是可以!
  就是说不会发生上面的问题了。但是用户通常都会忘记在程序的外面在把这个借来的空间还回去!内存空间就这样泄露了!
可能也是这些另人无奈的问题,所以很多程序员把函数的参数设定为指针或者引用,以此来代替这种向外传输吧!总之,使用这种返回指针的函数要小心!

三、类成员的指针

类成员和一般的外部变量相互比较,不同就是它所在的域不同,这个域很重要,它决定了该变量可以使用的范围。那么一个指针如果要指向类的成员函数或者成员变量,那么除了要表达它的返回类型、参数列表或者类型之外,那么还要说明它所指向的变量(或者函数)的域,为了说明该域我们要使用类域限定:

class NJUPT {   static double money=20000000;   int num;   public:   NJUPT():num(10){};   int get(){return num;};   double getMoney(){reuturn money;} }

我们定义成员的指针为

int NJUPT:: *p;//指向int型成员变量 int (NJUPt::*)p()//指向int f()型成员函数。

为了使用这些指针,我们需要使用该类型的变量或者指针。

NJUPT s,*ps;

那么调用的方式为:

cout<*p)();

这个看起来似乎很奇怪!但是只要你想到我们定义的指针被限定在了类域中了(我们在开始定义的使用使用了NJUPT:: ),这么使用也是很自然的。
 

本文章更多内容<<上一页 - 1 - 2 - 3 - 4 - 下一页>>
本页地址
收藏到:[收藏夹] [百度搜藏] [新浪ViVi] [POCO网摘] [ 和讯网摘] [好哦网摘] [Google书签]
               
[搜狐网摘] [365Key网摘] [天极网摘] [我摘] [博采网摘] [igooi网摘]
相关文章

C++:最强大的.NET语言之对象构造
在CPP中调用Jscript中的函数
要求对象产生于Heap之中
C++中要求(或禁止)对象产生于heap中
C/C++ 程序设计员应聘常见面试试题深入剖析
C语言教程第二章: 数据类型、运算符、表达式
C语言教程第二章: 数据类型、运算符、表达式
C语言教程第二章: 数据类型、运算符、表达式
C语言教程第二章: 数据类型、运算符、表达式
C语言教程第二章: 数据类型、运算符、表达式
C++对象的拷贝与赋值操作
初学者必备:C++经典入门详细教程
C++的救赎 C++开源程序库评话
踏入C++中的雷区——C++内存管理详解
在c++程序中重启自己的一种方法
如何编写异常安全的C++代码
C++程序员必需的修养
设计OutLook风格的工具栏
创建可移植的64位应用程序代码
C++箴言:为类型信息使用特征类

相关评论


本文章所属分类:首页 推荐教程 C++C语言   C++C语言