&GetListCtrl()这句话为什么函数前边有一个"&"

来源:百度知道 编辑:UC知道 时间:2024/05/29 09:00:26
在编程中遇到这样一段代码,
CListCtrl *ctl ;
//获取列表视所对应的列表控件
ctl = &GetListCtrl() ;
我很奇怪:
&GetListCtrl()这句话为什么函数前边有一个"&"

呵呵,按照“憬泓”的说法,能否解释一下,为什么不干脆写代码:
CListCtrl ctl = GetListCtrl();
或:
CListCtrl ctl;
ctl = GetListCtrl();

无论哪一种写法,似乎更符合我们一般的逻辑思维,但执行结果都是通不过编译的。

正确写法:
CListCtrl* ctl = &GetListCtrl();

CListCtrl& ctl = GetListCtrl();

返回一个CListCtrl类型?返回一个类的实例这是有违C++的编程常理的吧,效率太低了。它返回的是一个CListCtrl的引用,而不是一个CListCtrl.

至于要解释的话,估计楼主看不懂,简单提一点:
C++类的构造函数,如默认构造函数,如果被这样定义
class X {
protected:
X();
};
那么我们不能创建它的实例了:
X x;//导致编译出错
道理是因为构造函数不对外,我们在外面无法使用构造函数。

那么如果CListCtrl的构造函数也是这样做的,是不是就能解释楼主的奇怪问题以及正确答案了呢? 两种正确答案的代码都是力争避开调用不公开的构造函数,这个是写代码的初衷也是答案。

GetListiCtrl()返回的是CListCtrl类型,而指针的值是地址,所以加了取地址符号,取得控件地址赋值给指针。然后*ctl就可以直接指向控件了。

get its reference,获得应用。如果不能使用拷贝构造一般就这么写。