static const有关问题
static const问题
c++primer中说:const static 数据成员在类的定义体中初始化时,该数据成员仍把必须在内的定义体之外定义。
为什么我在vs2010实验了之后,发现类外的定义(在头文件中定义)可有可无呢。而且如果定义写在实现文件中,还会有重定义错误。
请知道的大牛讲解讲解。
------解决方案--------------------
如果不定义,但并没有使用到这个常量,就不会报错;
如果到头文件中,多次包含这个类定义的头文件时就会造成重复定义,一般是像这样做:
A.cpp
A.h
------解决方案--------------------
变量的声明都是放在头文件中.
变量的定义尽量都放到.cpp中. 因为.h会被其它.cpp包含, 而.cpp是独立的编译单元.
所以, 如果一个头文件中定义的变量, 并且这个头文件被多个.cpp文件包含, 那么多个.cpp编译单元中都会有那个变量 , 肯定会重定义了.
所以放到.cpp文件中是比较安全的做法.
------解决方案--------------------
1)整型静态成员常量,比较特殊,因为他可能就仅仅是个常数,本身是个常量表达式。
不用类外定义,只需要类内定义就可以了。
2)其他类型的静态成员常量,静态成员变量实质上都是变量,不构成常量表达式,所以必须在类外定义
3)C++11 ,所有成员都可以类内初始化,不知道还需不需要类外定义。
------解决方案--------------------
如果能编译、连接成功,最终生成可执行文件,那么你可以不用在cpp中定义。因为,你用到的地方都被相应的常量替换了,因此在连接过程中就没有用到这个符号。
如果,遇到了连接问题,那么你就得在cpp中定义它了。
什么时候遇到连接问题呢?
最典型的场景:你用到了这个变量的引用和或者地址。
c++primer中说:const static 数据成员在类的定义体中初始化时,该数据成员仍把必须在内的定义体之外定义。
为什么我在vs2010实验了之后,发现类外的定义(在头文件中定义)可有可无呢。而且如果定义写在实现文件中,还会有重定义错误。
请知道的大牛讲解讲解。
------解决方案--------------------
如果不定义,但并没有使用到这个常量,就不会报错;
如果到头文件中,多次包含这个类定义的头文件时就会造成重复定义,一般是像这样做:
A.cpp
class A
{
public:
static const int m;
static const char p[];
};
A.h
const int A::m=100;
const char A::p[]="abcdefg";
------解决方案--------------------
变量的声明都是放在头文件中.
变量的定义尽量都放到.cpp中. 因为.h会被其它.cpp包含, 而.cpp是独立的编译单元.
所以, 如果一个头文件中定义的变量, 并且这个头文件被多个.cpp文件包含, 那么多个.cpp编译单元中都会有那个变量 , 肯定会重定义了.
所以放到.cpp文件中是比较安全的做法.
------解决方案--------------------
1)整型静态成员常量,比较特殊,因为他可能就仅仅是个常数,本身是个常量表达式。
不用类外定义,只需要类内定义就可以了。
2)其他类型的静态成员常量,静态成员变量实质上都是变量,不构成常量表达式,所以必须在类外定义
3)C++11 ,所有成员都可以类内初始化,不知道还需不需要类外定义。
------解决方案--------------------
如果能编译、连接成功,最终生成可执行文件,那么你可以不用在cpp中定义。因为,你用到的地方都被相应的常量替换了,因此在连接过程中就没有用到这个符号。
如果,遇到了连接问题,那么你就得在cpp中定义它了。
什么时候遇到连接问题呢?
最典型的场景:你用到了这个变量的引用和或者地址。