练习7.56
什么是类的静态成员?他有何有点?静态成员与普通成员有何区别?
解答:
【引用】与类本身直接相关的成员。
练习7.57
编写你自己的Account类。
解答:
参考书中实现吧。
练习7.58
下面的静态数据成员的声明和定义有错误吗?请解释原因。
// example.h
class Example{
public:
static double rate = 6.5;
static const int vecSize = 20;
static vector<double> vec(vecSize);
};
//example,c
#include "example.h"
double Example::rate;
vector<double> Example::vec;
解答:
以下是clang3.4给出的错误提示,相较VS2013和gcc4.8.2的提示来说更好理解一些。
test.cc:8:19: error: non-const static data member must be initialized out of
line
static double rate = 6.3;
^ ~~~
test.cc:10:35: error: unknown type name 'vecSize'
static vector<double> vec(vecSize);
^
test.cc:14:21: error: definition or redeclaration of 'rate' not allowed inside a
function
double Example::rate;
~~~~~~~~~^
test.cc:15:31: error: definition or redeclaration of 'vec' not allowed inside a
function
vector<double> Example::vec;
~~~~~~~~~^
当使用为rate添加const标识时,其会将const和double联系在一起,作为一个新的类型。
所以,这里rate需要在类外定义。
不大清楚这里为什么要输入类型名称。
不过,应该清楚怎么改。将但参数和括号去掉,在类外去定义这个成员。
(2014.12.03更新,这里要求输入一个类型,是因为C++将其解析为一个函数声明,所以让你输入类型以确定这是一个正确的函数声明。这就是一个名为“C++’s most vexing parse”(最令人头痛的语法解析)的东西, 有兴趣的同学可以去 http://en.wikipedia.org/wiki/Most_vexing_parse 或 http://qiezhuifeng.diandian.com/post/2012-08-27/40038339477 这里看看。)
在C文件中,重定义了类中的变量,所以会报错。