收录查询

3个用来说明类型存储性质的说明符:static/virtual/friend和宏

DEMO:

//my.h

#ifndef MY_H
#define MY_H

class CMyClass1
{
public:
          CMyClass1();
          ~CMyClass1();
          virtual int myFun();
          virtual void myFun2()=0;
public:
          static const  int  memberFuncNum;
};
#endif

=========================================================
//my.cpp


#include "my.h"

/*static*/ const int CMyClass1::memberFuncNum=4;

CMyClass1::CMyClass1()
{
}

/*virtual*/ int CMyClass1::myFun()
{
 return 0;
}

/*virtual*/ void CMyClass1::myFun2()
{

}

CMyClass1::~CMyClass1()
{
 
}

============================================================
//test.cpp

/* 测试只在class中存在的static const */
#include <iostream>
#include "my.h"
using namespace std;

int main()
{
 cout<<"class member fuction Number="<<CMyClass1::memberFuncNum<<endl;
 cin.get();
 return 0;
}

===========================================================
static和virtual是2个类型存储性质的说名符号:

(1)正因为它的性质是“用来说明类型的存储某种类型对象(变量)的性质的”,所以它们能且只能出现在*.h中
(2)virtual说起来有点复杂,可以看下《深度探索C++对象模型》等书
==========================================================
宏:
(1)简单宏还是比较有用的,具有类似函数功能的宏应该禁止使用

简单宏:如,#define     PI        3.1415926

具有函数功能的宏:如,#define    MAX(first,second)    (((first)>(second))?(first):(second))

(2)如果你有很多的简单宏,可以把它们定义在1个头文件中,分类成块,并写好它们负责什么功能
//ProjectGlobalMACRO.h

//实现网络模块功能的宏
#define               NET_MACRO_FIRST             100
#define               NET_MACRO_SECOND        200
................

//实现安全模块功能的宏
#define              SECURITY_MACRO_FIRST                101
#define              SECURITY_MACRO_SECOND           201
.................

//xxxxxxxxxxxx
.......

(3)你在任何的地方使用到宏的时候,别忘了在后面加上1句简单得不能在简单的注释类似下面的

如://MACOR(定义在:ProjectGlobalMACRO.h  文件中)

(4)你可以选择:inline/const/template/inline + const/template+inline+const 的组合来替换MACRO,上面3条只为那些想......... C/C++的人使用,天知道别人怎么要求你怎么写代码,所以,技多不压身!

==============================================================
static [C++语言中的: pure specifier(声明符/说明符)]----------有些地方可能不对,还请指正

1. 使用的时候有7个方面需要高度注意:
(1)写在CLASS中,要注意: 只能放置在public域中,如果不是这样的话,在VC6.0中它的值只能是缺省的0
(2)虽然static和const一起作用的时候没有先后顺序之分,但是,建议采用: static const的形式,因为通常这样更容易
     说明被修饰的成员变量是const只读的(就近原则)
(3)static修饰的成员变量必须放到类的定义外面进行初始话,并且作为修饰符来说: 在类外面要把它"扔掉"
(4)static const只是在编绎期确保语义正确, 实际仍是一个变量,不过由于放置的位置不同,导致初始化形式有差异
(5)static用在CLASS中通常还表示"只保存一份类的成员变量,并且是共享的"
(6)extern+cosnt多文件包含的时候,需要使用extern说明定义在别的文件中
因为const是内部链接性,所以,如果想在别的文件中引用,必须做到下面2点
     (A)定义: extern const int foovalue = 20;        //假设定义在A.H头文件中
     (B)使用: extern const int foovalue;                //在其它文件中引用之
(7)extern+static+const ////////////先空着,想好了再补上
=================================================================================
在CLASS中public域中,声明的形式可以分以下3种:
(1)static int foovalue;         //可写的,类的共享内存区中的数据
(2)const int foovalue;        //这个行不通,可以通过2种方式来做,1种是enum{foovalue=10};或者使用下面的(3)
                                      //而且,如果不是用在CLASS中,cosnt int foovalue=10; int arr[foovalue]={....};叫"常量折叠"
(3)static const int foovalue;    //这个需要在CLASS外部初识化,并且只能初识化一次

其中前2种情况有1个共性-----------它们会导致编译器为成员变量赋0值
而惟一的差别是----------------------对于(1)因为没有加const修饰,你可以修改成员变量的值

posted @ 2005-12-31 07:36  ->  阅读(560)  评论(0)    收藏  举报