当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 构造函数中的this指针

VC++
用VC++创建自定义向导程序
自定义 CRichEditCtrl 控件
Office 2000 风格的停泊、智能型菜单
黑客攻击手段之偷梁换柱
完善 CPopupText 类
让工具条显示256色图像
定制编辑框的上下文菜单
列表控件排序功能的实现
一个优秀的网格控件CGridCtrl
如何用代码动态添加控件
如何在编辑框中使用IAutoComplete接口
应用程序中添加“Coolbars”的简单方法
介绍一个有Toolbar功能的可重用类 CPopupText
在工具栏按钮上添加文本标签
类似Dreamweaver的颜色选择器
如何设置ListView控件的完全行(Full Row)选项
如何enable/disable菜单项
关于CEdit控件的透明 --作者:monsoon
动态菜单项、状态条提示、工具条提示问题
CAnimateCtrl::Open的使用问题

VC++ 中的 构造函数中的this指针


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 192 ::
收藏到网摘: n/a

构造函数中的this指针
作者:温昱

说明:感谢网页C++ FAQ Lite的作者Marshall Cline和译者申旻;感谢《C++语言核心》一书的作者Gregory Satir和Doug Brown及译者张铭泽

-------------------------------原理-------------------------------

某些人认为不应该在构造函数中使用this指针,因为这时this对象还没有完全形成。

但是,只要小心,是可以在构造函数中使用this指针的:

●在函数体中

●初始化列表中

因为“对象还没有完全形成”不意味着“什么都没有”。

在进入构造函数(及其chaining)之前,Compiler会:

●给class的instance分配内存

●建立运行时刻系统所需的信息(如vtbl等)

●##缺省地## 构造所有类成员

-----------------------------【能】---------------------------------

构造函数的函数体(或构造函数所调用的函数)【能】可靠地访问:

●基类中声明的数据成员

●构造函数所属类声明的数据成员

这是因为所有这些数据成员被保证在构造函数函数体开始执行时已经被完整的建立。

-----------------------------【不能】---------------------------------

构造函数的函数体(或构造函数所调用的函数)【不能】向下调用:

●被派生类重定义的虚函数

这是因为在基类的构造函数执行期间,“对象还不是一个派生类的对象”。

---------------------------【有时】-----------------------------------

以下是【有时】可行的:

●传递 this 对象的任何一个数据成员给另一个数据成员的初始化程序

你必须确保该数据成员已经被初始化。好消息是你能使用一些不依赖于你所使用的编译器的显著的语言规则,来确定那个数据成员是否已经(或者还没有)被初始化。坏消息是你必须知道这些语言规则(例如,基类子对象首先被初始化(如果有多重和/或虚继承,则查询这个次序!),然后类中定义的数据成员根据在类中声明的次序被初始化)。如果你不知道这些规则,则不要从this对象传递任何数据成员(不论是否显式的使用了this关键字)给任何其他数据成员的初始化程序!如果你知道这些规则,则需要小心。

----------------------------用途----------------------------------

好的OO设计强调“高聚合”,这样会产生很多小的责任单一的对象(其实“单一责任原则”根本就是最基础的OO原则)。

那么,小对象之间的协作就需要配置(其实“协作可配置”本身就是我们希望的灵活性所在):

●比如Observer模式中subject和observer的协作需要调subject.RegistorObserver(observer)来配置

●再比如多媒体框架DirectShow中filterGraph和videoWindow的协作需要调filterGraph.SetVideoWindow(videoWindow)来配置

而构造函数是很典型的配置时机,举例如下:


class CMyWindow : public CWnd
{
private:
CFilterGraph filterGraph;
public
CMyWindow() { filterGraph.SetVideoWindow(this); };
};
--------------------------附录------------------------------------

顺便总结基础知识

表一
who be called
普通函数 class::fun()
构造函数 superclass::superclass() ==〉subclass::subclass()
析构函数 subclass::~subclass() ==〉superclass::~superclass()

表二
who where