thinking in c++ 中有一处错误,他认为类的静态数据成员的定义具有内部连接属性,可以放在头文件里面,这是不对的。下面具体说明。
关于类的静态数据成员,他的定义必须在类的外部,并且只能有一次定义。这个定义,具有外部连接属性,最好放在类的实现文件里面,不能放在类的头文件里面。
下面的例子证明这一点。
3个文件,一个header.h,header.c main.c
首先是header.h
#ifndef HEADER_H
#define HEADER_H
#include < iostream >
using namespace std;
class testClass
... {
static int i;
int j;
public:
testClass();
testClass(int k);
void print()...{
cout<<"i="<<i<<" j="<<j<<endl;
return;
}
} ;
// int testClass::i=5;
#endif
#define HEADER_H
#include < iostream >
using namespace std;
class testClass
... {
static int i;
int j;
public:
testClass();
testClass(int k);
void print()...{
cout<<"i="<<i<<" j="<<j<<endl;
return;
}
} ;
// int testClass::i=5;
#endif
header.c
#include
"
header.h
"
int testClass::i = 5 ;
testClass::testClass()
... {
j=0;
}
testClass::testClass( int k)
... {
j=k;
}
int testClass::i = 5 ;
testClass::testClass()
... {
j=0;
}
testClass::testClass( int k)
... {
j=k;
}
main.c
#include
"
header.h
"
int main()
... {
testClass A;
testClass B(2);
A.print();
B.print();
return 1;
}
int main()
... {
testClass A;
testClass B(2);
A.print();
B.print();
return 1;
}
上面这个例子中,静态变量i的定义,只能放在类的实现文件里面,不能放在头文件里面。否则会出现重定义。
这说明具有外部连接属性。
关于静态数据成员,有一类特殊的,那就是const的静态数据成员,
类似:const static int i=0;
可以在类的声明中定义。其他的都不可以。