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

VC++
如何有效地使用对话框
一个定制CFileDialog对话框的实例
XP风格复活节彩蛋的实现
程序界面多模式显示的实现
改变视图单调的背景
使窗体拥有透明效果的API
《电子尺》V1.02程序开发实例
美化你的应用程序的外观界面
个人考勤软件开发实例
使用VC6.0实现窗口的任意分割
如何让一个打开的文档成为活动文档
创建非矩形窗口的简单方法
轻松实现类VC界面
视图的缩放的完整论述
如何获得另一个应用程序窗口中的文本
如何发送命令到文档对象
动画窗口的实现-VC++实例一则
如何在其他程序的窗口上创建按钮并使之能响应
如何在基于对话框的程序中动态设置鼠标指针
扩展COleDropTarget类来支持任意窗口拖放 - 作者:王加宝

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 182 ::
收藏到网摘: 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