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修饰,你可以修改成员变量的值
浙公网安备 33010602011771号