Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1028253
  • 博文数量: 243
  • 博客积分: 3053
  • 博客等级: 中校
  • 技术积分: 2975
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-02 21:11
文章分类

全部博文(243)

文章存档

2013年(2)

2012年(20)

2011年(5)

2010年(114)

2009年(102)

我的朋友

分类:

2010-11-02 19:00:36

先看下面的例子
 
#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修饰符。把这三种情况当作公式背下来就不会再出错了。
 
最后,模板的定义和声明必须放在同一个文件.

阅读(2855) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~