先看下面的例子
#include
using namespace std;
template
class A{
public:
A(T n):v2(n){}
static T v1;
const T v2;
static const T v3=3;
};
template
T A::v1=1;
int main(){
printf("%d",sizeof(A));
printf("%d",sizeof(A));
getchar();
}
运行结果上面是4,下面是2 也就是说,只有一个成员是属于对象的,是哪一个呢?是v2!其实编译时,所有的静态变量都是在静态变量区定义的。虽然v2是常量,但是也是要占内存空间的,这其实就是C++里面常量和C里面的预处理符号常量的最大区别:C的符号常量是不占内存空间的,另外模板类是在每一次实例化的时候编译的,换句话说,如果代码里面没有用到模板类,那么类里面的语法错误就永远不会被发现。
所以A是4 A是2。
静态常量v3和v1一方面可以这么用:
a.v3 a.v1
但是,static声明的变量不止是属于对象的,还是属于这个类的,所以V3和V1还可以这么用
A::V3 //v1是一样的
慢着!编译出错了!
原来,A是模板类,永远记住,模板类是需要模板参数的,于是改成如下的语法:
A::V3
这里要注意,因为V3是在类里面直接赋值的,所以这里类型声明只能是整型(char,short,int,long)否则会出编译错误,其实正因为V3是在类里面直接赋值的,而且又是只读的,所以模板参数也是无所谓的。
当然V3也可以在外面赋值
template
const T A::v3 = 3;
记住,static必须在类外初始化,const必须在构造函数初始化表初始化,static const可以在类的外面也可以在里面初始化,但是要带上const修饰符。把这三种情况当作公式背下来就不会再出错了。
最后,模板的定义和声明必须放在同一个文件.
阅读(2868) | 评论(0) | 转发(0) |