2.C++的重要性质(深入浅出MFC之读书笔记)

原创 2012年03月27日 20:46:54

this指针:

类的每一个成员函数(非static)都带一个隐藏参数this指针。

派生类对象可以赋给基类对象,但反过来不行,如果一定需要的话就需要使用指针做强制显示转型。

如果以一个“基类之指针”指向“派生类之对象”,那么经由该指针只能调用基类所定义的参数;如果以一个“派生类之指针”指向“基类之对象”,必须做明显的转型操作,不建议使用;如果基类和派生类都定义了“相同名称之成员函数”,那么通过对象指针调用成员函数时,到底调用哪一个函数,必须视该指针的原始类型而定,而不是视指针实际所指的对象类型而定,与第一点相同。

MFC有两个十分重要的虚拟函数:与document有关的Serialize函数和与view有关的OnDraw函数。

纯虚函数不需要定义其实际操作,它的存在只是为了在派生类中被重新定义。只要是拥有纯虚函数的类就是一个抽象类,它是不能够被实例化的,也就是说不能根据它产生一个对象。虚函数派生下去仍为虚函数,且可以省略virtual关键字。

每一个“内含虚函数的类”,编译器都会为它做出一个虚函数表,表中的每个元素都指向一个虚函数的地址,此外,编译器当然也会为类加上一项成员变量,是一个指向该虚函数表的指针(常被称为vptr)。每一个由此类派生出来的对象都有这么一个vptr。当我们通过这个对象调用虚函数时,事实上是通过vptr找到虚函数表,再找出虚函数的真实地址。当我们在派生类中改写虚函数时,虚函数表就受到了影响:表中元素所指的函数地址将不再是基类的函数地址,而是派生类的函数地址。

class CMyDoc::public CDocument

CMyDoc mydoc;

((CDocument)mydoc).fun();

上述调用中调用的将是基类CDocument中的函数,因为派生类对象通常都比基类对象大(指内存空间),那么向上强制转型将会造成对象的内容被切割。

静态(static)成员变量不属于对象的一部分,而是类的一部分,所以程序可以在还没有诞生任何对象的时候就处理此种成员变量,但首先必须初始化它。不要把static成员变量的初始化安排在类的构造函数中,因为构造函数可能被一再地调用,应该在应用程序文件中,类以为的位置设定初值。设定static成员变量初值时,不受任何存取权限的束缚。注意static成员变量的类型也出现在初值设定语句中,因为这是一个初值设定操作而不是赋值操作。如果希望在产生任何对象之前就存取其类的private static成员变量,则必须设计一个static成员函数。由于static成员函数不需要借助任何对象就可以被调用执行,所以编译器不会为它暗加一个this指针。也因为如此,static成员函数无法处理类之中的non-static成员变量。

new相比于malloc不但配置对象所需的内存空间,同时会引发构造函数的执行。一个有着层次结构的类群组,当派生类的对象诞生之时,构造函数的执行是由最基类至最尾端派生类;当对象要毁灭之前,析构函数的执行则是反其道而行。

对于全局对象,程序一开始,其构造函数就先被执行(比程序进入点更早);程序即将结束前其析构函数被执行。对于局部对象,当对象诞生时,其构造函数被执行;当程序流程将离开该对象的存活范围(以至于对象将毁灭)时,其析构函数被执行。对于静态对象,当对象诞生时构造函数被执行;当程序将结束时(此对象因而将遭致毁灭)其析构函数才被执行,但比全局对象的析构函数早一步执行。对于以new放生产生出来的对象,当对象诞生时期构造函数被执行,析构函数则在对象被delete时执行。

静态全局对象的构造函数调用操作必须依靠startup码帮忙,startup码是更早于程序进入点(main或winmain)执行起来的码,由C++编译器提供被链接到程序中。当编译器编译程序时,发现一个静态对象时,它会把这个对象加到一个链表之中,它还加上一个指针,指向对象之构造函数及其参数(如果有的话)。把控制权交给程序进入点之前,startup码就会快速在该链表上移动,调用所有等级在案的构造函数并使用登记在案的参数,于是就初始化了静态对象。

在程序执行过程中知道某个对象属于哪一种类在C++中称为执行期类型信息(Runtime Type Information,RTTI)的能力。

C++的template有两种,分别针对function和class。

Template Functions:

template <class T>// T是一种类型,而此类型将在调用此函数时才给予;

T function(T a,int b)

Template Classes:

template <class T>

class CThree

{

public:

CThree(T t1,T t2,T t3);

T Min();

T Max();

private:

T a,b,c;

};

template <class T>

T CThree<T>::Min()

{

T minab=a<b?a:b;

return minab<c?minab:c;

}

注意每一个成员函数前都要加上template<class T>,而且类名应该使用CThree<T>。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

深入浅出MFC读书笔记——c++对象重要性质

工作需要,开始学习MFC,最近在读《深入浅出MFC》,将所看的内容整理作为笔记 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...

学习笔记之深入浅出MFC 第8章 C++重要性质---构造函数与析构函数

C++的new云算子和C的malloc函数都是用于配置内存的,但是前者比之后者的优点是,new不但配置对象所需要的内存空间,同时会引发构造函数的执行。 所谓的构造函数(constructor),就是对...

学习笔记之深入浅出MFC 第8章 C++重要性质----基类与派生类:谈继承(Inheritance)

继承是C++最神秘而特有的性质。矩形是形,椭圆形是形,三角形也是形。苍蝇是昆虫,蜜蜂是昆虫,蚂蚁也是昆虫。人们习惯把相同的性质抽离出来,成立一个基类(base class),再从中衍化出派生类(der...

学习笔记之深入浅出MFC 第8章 C++重要性质---Template

到底什么是template? 其重要性如何呢?下面我们先来了解一下这个在C++中很重要的性质。 很多时候,我们会碰到这样一种情况,一个函数或一段代码相同,但是我们使用的数据类型不同,那么我们经常需要...

学习笔记之深入浅出MFC 第8章 C++重要性质-----类封装

“面向对象”在软件界是众所周知的。其实,面向对象的程序设计(OOP即Object Oriented Programming)其实是一种观念,用什么语言实现都可以。只不过使用面向对象程序语言(Objec...

学习笔记之深入浅出MFC 第8章 C++重要性质---异常处理(Exception Handing)

异常情况(Exception)是一个颇为新鲜的C++语言特性,可以帮助你管理执行期的错误,特别是那些发生在多层嵌套函数调用中的错误。现在C++编译器必须支持异常处理情况。 C++的exception...

学习笔记之深入浅出MFC 第8章 C++重要性质----虚拟函数与多态(Polymorphism)

1、虚拟函数的由来 上面我们曾经提过一个例子: CShape shapes[5]; . . . //令5个shapes各为矩形、正方形、椭圆形、圆形、三角形 for ( int i = 0; ...

深入浅出MFC学习笔记:(第一章:win32基本概念,第二章:C++的重要性质)

深入浅出MFC阅读笔记:   写在开始的话: 刚结束《C++primer》的第二次阅读,决定趁热打铁,学习《深入浅出MFC》。当然,学习框架不是目的,而是通过学习MFC底层框架实现原理,对C...

深入浅出MFC读书笔记2

  • 2010-08-28 08:11
  • 5.51MB
  • 下载

1.Win32基本程序概念(深入浅出MFC之读书笔记)

Windows程序分为“程序代码”和“UI资源”两大部分,两部分最后以RC编译器整合为一个完整的的exe档案,如图所示。 Windows程序调用的函数可分为C Runtimes以及Windows A...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)