回 帖 发 新 帖 刷新版面

主题:难者不会,会者不难的问题?

在VC中,常规调用类库函数是:
假设A类下一个B函数,A::B(),这样调用。
见过很多代码都::B()这样调用。这时为什么?
请问什么时候可以这样调用,什么时候应该这样调用?

回复列表 (共15个回复)

沙发

在类函数,  ::B() 是调用全局函数, 而不是使用类中同名函数.

板凳

CSplashWnd::~CSplashWnd()
{
::GlobalUnlock(hBitsSrc);//解锁内存
}
类似的这种函数从哪时调用。什么意思?
怎么调用?

3 楼

GlobalUnlock  是Windows 的API 函数

4 楼

CSplashWnd::~CSplashWnd()
{
::GlobalUnlock(hBitsSrc);//解锁内存
}

::GlobalUnlock(hBitsSrc);
它为什么要这样用?
::代表什么意思?

5 楼

CSplashWnd::~CSplashWnd()
{
::GlobalUnlock(hBitsSrc);//解锁内存
}


在这个例子中::GlobalUnlock(hBitsSrc)若用GlobalUnlock(hBitsSrc)代替有什么不一样?假设它是从A类中引出的,为什么不用A::GlobalUnlock(hBitsSrc)来用,又有什么不一样?

6 楼

这里你恰恰理解错了,::叫做作用域限定符,首先应该明白,使用它就是为了指定所用对象或者函数的来源域,因为在类方法中调用函数,一般不加任何标志表示默认调用的是本类的成员函数,或者成员变量,这无可非议,但是如果需要调用非本类的函数,比如其他类的public型的静态函数或者本类的父类(基类)甚至祖先类(如果有的话)中的被本类覆盖的protected或者public型的函数(叫作方法或许更确切些),就需要用显式的方式指明,方式就是“类名::方法名(参数列表)”或者“类名::变量名”。当然,在本类中使用本类的成员也可以这样,不过显然有点多此一举之嫌。还比如使用"this->本类方法或this->本类变量" 几乎是同样的作用。但是在使用本类变量时,有时也是有必要的。关于此我举例如下:
#include <istream.h>
class A
{
protected:
    int a;//----------->1
public:
    void set_a(int a)//set方法
    {
        this->a = a;//前一个a被指定为1所标志的a,即本类成员,但是后者默认为本方法成员,即参数表中定义的变量a,从而可以避免冲突。
        //or
        //A::a = a;//作用同上
    }
    int get_a()//用返回值方式得到类变量的值,get方法1
    {
         return a;//没有与之混淆的变量,直接使用本类成员。
    }
    void get_a(int &a)//用引用方式返回类变量的值,get方法2
    {
        a = this->a;//后者用显式方式指定使用类成员,前者使用方法变量
        //or
        //a = A::a;//同上
    }
};

class AA: public A
{
private:
    int aa;
public:
    AA(): A::a(0)
    //无参构造函数
    {
        aa = 0;
    }
    AA(int a) : A::a(a)
    //构造函数,同时用参数a对基类的成员变量a进行初始化
    {
        aa = a;
    }
    int get_aa()
    {
        return aa;
    }
    void get_aa(int &a)
    {
        a = aa;
    }
};

void main()
{
    int l,m,n;
    A a;
    a.set_a(5);//使用常数作为参数为A的成员变量a赋值
    m = a.get_a();//调用get方法1
    cout<<"m="<<m<<endl;//输出m,将是5;
    a.set_a(l=6);//使用变量作为参数为A的成员变量a赋值
    a.get_a(n);//调用get方法2
    cout<<"n="<<n<<endl;//输出n,将是6;
    AA aa(5);
    aa.get_a(l);//调用父类a中的get方法2
    cout<<"l="<<l<<endl;//将输出????
    aa.set_a(7);//调用父类a中的set方法
    aa.get_aa(m);//调用类方法
    cout<<"m="<<m<<endl;//输出m,将是????
    aa.get_a(n);//调用父类方法
    cout<<"n="<<n<<endl;//输出n,将是????
}

以上所举之例均为关于类内成员的使用方面,另外就是关于使用公共函数,一般就是系统API或者自定义公共函数。
方法就是直接使用或者显式使用::符号。如果有冲突时,要使用外部公共函数,::符号是必须的,否则将是使用作用域最近的,当然,在类里面使用就是类成员最近了。所以说,上面楼主所问的问题当中,如果函数是类成员,不加::就是指调用类内函数,这和加了A::是一样的,但是这和加了::是不同的。

7 楼

谢谢.真是看君一席话,胜读一年书啊.

8 楼

全局函数不都是以AFX开头的吗?
这里不是,又怎么解释?

9 楼

那是你想当然!
有谁说过全局函数一定都要以afx开头?
还有自定义函数名字自己取,更没有这个限制了。

回去多看看书吧!
还有别忘了给帖子评分!

10 楼

方法就是直接使用或者显式使用::符号。如果有冲突时,要使用外部公共函数,::符号是必须的,否则将是使用作用域最近的,当然,在类里面使用就是类成员最近了。所以说,上面楼主所问的问题当中,如果函数是类成员,不加::就是指调用类内函数,这和加了A::是一样的,但是这和加了::是不同的。

以上引用6楼楼主。
请问什么是公共函数。什么是外部公共函数?

我来回复

您尚未登录,请登录后再回复。点此登录或注册