《深入浅出MFC》第二章 C++的重要性质-笔记(二)

静态成员(变量和函数)

static成员变量不属于对象的一部分,而是类的一部分,所以程序可以在没有诞生任何对象的时候就处理此种成员变量

必须先初始化它,变量的初值只应该设定一次,应该在应用程序文件中,全局函数中,或任何函数之外。

class SavingAccount

{

    private:

        char  m_name[40];

        char  m_addr[60];

        double  m_total;

        static  double  m_rate;//静态成员变量

}

/*初始化静态成员变量,它是private成员,但设定初值时不受影响

事实上static成员变量是在这个时候(而不是在类声明中)才定义出来的

*/

double  SavingAccount::m_rate = 0.0075;

static成员变量并不是因为对象的实现才得以实现的,它本来就存在,可以想象它是一个全局变量

如果希望在产生任何对象之前就存取类的私有static变量,则必须设计一个static成员函数

由于static成员函数不需要借助任何对象就可以被调用,所以编译器不会为它暗加一个this指针,正因为此,static成员函数无法处理类之中的非static成员变量

static成员函数“没有this参数”的这种特性,正是我们的MFC应用程序在准备callback函数时所需要的。

C++程序的生与死:兼谈构造函数和析构函数

C++的new运算符和C的malloc函数都是用于分配内存,但new的优点是不但分配对象所需的内存,同时会引发构造函数的执行。

一个有着多层结构的类,当派生类的对象诞生之时,构造函数的执行是由最基类(most based)到最尾端派生类(most derived);当对象要消毁之前,析构函数的执行则相反。

对于函数内的static对象,当函数被调用对象诞生,此时其构造函数将被调用,当函数调用结束,其析构函数不会被调用,只有程序结束是才被调用,而且比全局对象的析构函数早

全局对象的变量的实现于任何“函数活动范围”之外,所以其构造函数的调用必须靠Startup代码帮忙,Startup代码是更早于main或WimMain执行起来的代码,由C++编译器提供,被链接到程序中,Startup代码可能做些象函数库初始化、进程信息设立、I/Ostream产生等等操作,以及对static对象的初始化操作,也就是调用其构造函数。

当编译器编译程序时,发现一个静态对象时,它会把这个对象加到一个链表之中。更精确的说法是,编译器不只是加上此静态对象,它还加上一个指针,指向对象之构造函数及其参数(如果有的话)。把控制权交给程序进入点(main或WinMain)之前,Startup代码会快速在该链表上移动,调用所有登记在案的构造函数并使用登记在案的参数,于是就初始化了程序的静态对象。

运行时类型识别(RTTI)

/*可以用typeid()来这样判断一个对象是否属于某个类,用时要加上typeinfo.h头文件*/

if(typeid(aClass)==typeid(aObject))

    ...

异常处理(Exception Handling)

//异常处理的完整结构:

try

{

...

}

catch(char *p)/

{

  printf("Caught a char * exception, value %s\n", p);

}

catch(double d)

{

  printf("Caught a numeric exception, value %g\n", d);

}

catch(...)//catch anything

{

  printf(Caught an unknown exception);

}

Template Functions

//模板函数的格式

template

T Power (T base, int exponent)

{

    T result = base;

    if(exponent == 0) return (T)1;

    if(exponent < 0 ) return (T)0;

    while(--exponent) result *=base;

    return result;

}

//使用

void main()

{    

int i = power(5, 4);   

long l = power(1000L, 3);    

double d = power(3.34, 2);    

cout << i << endl;   

cout << l << endl;    

cout << d << endl;    return ;

}

Template Classes

//模板类的格式

template

class CThree

{

public:

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

    T Min();

    T Max();

private:

    T a, b, c;

};

template

T CThree::Min()

{

    T minab = a < b ? a : b;

    return minab < c ? minab : c ;

}

template

T CThree::Max()

{

    T maxab = a < b ? b : a;

    return maxab < c ? c :  minab;

}

template

CThree::CThree(T t1, T t2, T t3) : a(t1), b(t2), c(t3)

{

 return ;

}

// 使用

void main()

{

CThree obj1(2,5,4);    

cout << obj1.Min() <

cout << obj1.Max() <

CThree obj2(8.52, -6.75, 4.54);        

cout << obj2.Min() <

cout << obj2.Max() <

CThree obj3(646600L, 437847L, 364873L);        

cout << obj3.Min() <

}

你可能感兴趣的:(《深入浅出MFC》第二章 C++的重要性质-笔记(二))