构造函数中的this指针

2016-01-29 12:21 1 1 收藏

构造函数中的this指针,构造函数中的this指针

【 tulaoshi.com - C语言心得技巧 】

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

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

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

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

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

●在函数体中

●初始化列表中

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

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

●给class的instance分配内存

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

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

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

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

●基类中声明的数据成员

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

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

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

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

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

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

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

以下是【有时】可行的:

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

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

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

好的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

来源:https://www.tulaoshi.com/n/20160129/1485760.html

延伸阅读
比如 一个函数 chat(link &a); chat(ling *a); 前者引入一个地址做形参 是不是可以把一个指针变量p。。 这么用chat(p); 那跟第二个函数 有什么区别呢 都是传地址啊。。 小弟弄不明白~~ chat(int&a); chat(int *a); 这两个函数是完全不同意义的东西,你的理解主要是在int&a和int* a这个类型上面。要注意int&和int*是两个完全不同的...
声明函数指针并实现回调 作者:Danny Kalev 编译:赵湘宁 原文出处:Declaring Function Pointers and Implementing Callbacks     程序员常常需要实现回调。本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调。注意这里针对的是普通的...
C++类对象的拷贝构造函数 作者:韩耀旭 对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。 #include <iostreamusing namespace std;class CA{public:CA(int b){a=b;}void Show (){c...
  // test12.cpp : Defines the entry point for the console application.   //   #include "stdafx.h"   void func(int i)   {   printf("This is for test %i", i);   } !-- frame contents -- !-- /frame contents --   typedef void (*P...
标签: Web开发
/* +-------------------------------------------------------------------------------+ | = 本文为Haohappy读Core PHP Programming | = 中Classes and Objects一章的笔记 | = 翻译为主+个人心得 | = 为避免可能发生的不必要的麻烦请勿转载,谢谢 | = 欢迎批评指正,希望和所有PHP爱好者共同进步! | = ...

经验教程

133

收藏

87
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部