主题:难者不会,会者不难的问题?
勤径苦舟
[专家分:0] 发布于 2003-09-20 12:05:00
在VC中,常规调用类库函数是:
假设A类下一个B函数,A::B(),这样调用。
见过很多代码都::B()这样调用。这时为什么?
请问什么时候可以这样调用,什么时候应该这样调用?
回复列表 (共15个回复)
沙发
天字号药店 [专家分:1010] 发布于 2003-09-20 13:01:00
在类函数, ::B() 是调用全局函数, 而不是使用类中同名函数.
板凳
勤径苦舟 [专家分:0] 发布于 2003-09-20 13:59:00
CSplashWnd::~CSplashWnd()
{
::GlobalUnlock(hBitsSrc);//解锁内存
}
类似的这种函数从哪时调用。什么意思?
怎么调用?
3 楼
天字号药店 [专家分:1010] 发布于 2003-09-20 14:22:00
GlobalUnlock 是Windows 的API 函数
4 楼
勤径苦舟 [专家分:0] 发布于 2003-09-20 20:42:00
CSplashWnd::~CSplashWnd()
{
::GlobalUnlock(hBitsSrc);//解锁内存
}
::GlobalUnlock(hBitsSrc);
它为什么要这样用?
::代表什么意思?
5 楼
勤径苦舟 [专家分:0] 发布于 2003-09-20 20:45:00
CSplashWnd::~CSplashWnd()
{
::GlobalUnlock(hBitsSrc);//解锁内存
}
在这个例子中::GlobalUnlock(hBitsSrc)若用GlobalUnlock(hBitsSrc)代替有什么不一样?假设它是从A类中引出的,为什么不用A::GlobalUnlock(hBitsSrc)来用,又有什么不一样?
6 楼
meteor135 [专家分:6060] 发布于 2003-09-22 10:38:00
这里你恰恰理解错了,::叫做作用域限定符,首先应该明白,使用它就是为了指定所用对象或者函数的来源域,因为在类方法中调用函数,一般不加任何标志表示默认调用的是本类的成员函数,或者成员变量,这无可非议,但是如果需要调用非本类的函数,比如其他类的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 楼
勤径苦舟 [专家分:0] 发布于 2003-09-22 21:32:00
谢谢.真是看君一席话,胜读一年书啊.
8 楼
勤径苦舟 [专家分:0] 发布于 2003-09-22 22:24:00
全局函数不都是以AFX开头的吗?
这里不是,又怎么解释?
9 楼
meteor135 [专家分:6060] 发布于 2003-09-23 10:42:00
那是你想当然!
有谁说过全局函数一定都要以afx开头?
还有自定义函数名字自己取,更没有这个限制了。
回去多看看书吧!
还有别忘了给帖子评分!
10 楼
仁 [专家分:20] 发布于 2003-09-24 09:27:00
方法就是直接使用或者显式使用::符号。如果有冲突时,要使用外部公共函数,::符号是必须的,否则将是使用作用域最近的,当然,在类里面使用就是类成员最近了。所以说,上面楼主所问的问题当中,如果函数是类成员,不加::就是指调用类内函数,这和加了A::是一样的,但是这和加了::是不同的。
以上引用6楼楼主。
请问什么是公共函数。什么是外部公共函数?
我来回复