time 
设为首页】【收藏本站
当前位置: 主页 > 程序设计 > C\C++\VC > C++基础 > MFC控件指针公用释放方法[void* | 指针的引用]

MFC控件指针公用释放方法[void* | 指针的引用]

时间:2010-08-06 22:31 点击:1400次 字体:[ ]




前言

  看见重复的代码就想封装,这个习惯转入C++之后也没改,即使效率有所影响也尽力去封装,比如在类的析构函数里面释放指针,一个个判断然后一个个delete然后再设置为NULL,就想着写一个公用释放指针的方法,也就有了下面的问题一。
 

 

文章

C++返回引用类型
A& a(){ return *this;} 就生成了一个固定地址的指针,并把指针带给你

但A a() { return *this;}会生成一个临时对象变量,并把这个临时变量给你
这样就多了一步操作

当返回一个变量时,会产生拷贝。当返回一个引用时,不会发生拷贝,你可以将引用看作是一个变量的别名,就是其他的名字,引用和被引用的变量其实是一个东西,只是有了两个名字而已。

问题的关键是,当你想要返回一个引用而不是一个拷贝时,你要确保这个引用的有效性,比如:
int & fun() { int a; a=10; return a; }
这样是不行的,因为a会在fun退出时被销毁,这时返回的a的引用是无效的。
这种情况下,如果fun的返回类型不是int & 而是int就没有问题了。


指针的引用
GetNearestFontInTwips(CFont *&aFont, const TFontSpec &aFontSpec);

第一个参数aFont是一个指针, 前面加上*&表示指针的引用, 其实可以如下看待这个方式(CFont*) &aFont, 这就一目了然了.

 

正文

  一、问题函数

    本意:传入一个指针,判断指针是否为空,不为空的话就释放掉,这样在析构函数里面不用一段段重复写函数内的那段代码,封装后只用写如"FreeObj(pBtnSave);"就可以了。
 

BOOL FreeObj(void*  pObj)
{
    
if(pObj)
    {
        delete pObj;
        pObj 
= NULL;
        
return TRUE;
    }
    
return FALSE;
}

    现实证明这种方法是行不通的,执行此方法后pBtnSave指针仍然不为空,然后想到了指针引用,能够定义如下函数,但是使用起来很复杂(- - # 事实上不知道怎么使用):

BOOL FreeObj(void*  &pObj)

 

  二、折中办法
 

#define FreeObj(pObj) if(pObj){delete pObj;pObj=NULL}

  只是使用的话就不能带分号了,因为这是一个宏,然后发现C++宏好强大,这样写效率也应该没什么好说的了,但是被同事提醒,宏很强大但是切忌乱用。

 

  三、 一个指针的引用例子
 

void FreeObj(int* &pObj)
{
    
if(pObj){
        delete pObj;
        pObj 
= NULL;
    }
}

//测试代码
    int*   a; 
    
int b = 1;
    a 
= new int;
    
*= b;
    FreeObj(a);

    注意,如果测试代码写成如下则调用FreeObj(a)会出错:

    int*   a; 
    
int b = 1;
    a 
= &b;
    FreeObj(a);

    当前对C++涉足尚浅,有朋友能解答一下的话非常感谢!
 

 

  四、摘录C++ Primer中关于”函数参数声明成引用还是指针呢?“ ,也许有所启示。
 

    引用必须被初始化为指向一个对象,一旦初始化了,它就不能再指向其他对象。指针可以指向一系列不同的对象也可以什么都不指向。

 

 

结束语
 

  感觉还没入门,等项目稍微缓点了还是系统的来恶补C++吧,通过这个例子对指针有了新的认识,目前的理解是函数传递指针只是传递了一个地址而已,也就是拷贝了指向同一个地址的指针,而传值是拷贝的一份数据,不同的是拷贝的指针能改变改地址的数据。



本文地址 : http://www.fengfly.com/plus/view-185923-1.html
标签: MFC
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: