(1)静态变量:好像每次都需要进行在外部进行赋值,比如:
class Node{ static int a;}
我们必须使用int Node::a = 10;
如果没有这样的东西,那么就会出现错误。
(2)对于一般的静态函数,我们一般都是在类的内部已经对方法进行实现了。
如果你要在外部实现也是可以的。
下面我想对模版中的静态变量和静态函数进行一些分析:
(1)静态变量:
比如下面的定义:
template<class T>
class Node
{
public :
static int a;
}
我们必须在外部进行这样的实现:int Node<int>::a = 10;或者是int Node<float>::a = 10;这样都是行的,如果你在main函数定义的是Node<double> a;因为你前面没有Node<double>的实例化,那么这个东西是错误的,我们必需在前面有像int Node<double>::a = 10;这样的定义。
(2)静态函数:
比如下面的定义:
template<class T>
class Node
{
public
static void funA(){}
}
如果你是这样的定义,那么我们在main函数中就可以使用任何形式的比如这样的形式:Node<int>::funA(); Node<float>::funA(),Node<double>::funA();
等等一系列的函数,因为这里定义的是一系列的函数,无论你采用什么样的形式都可以。
但是如果你是这样定义的:
template<class T>
class Node
{
public : static void funA();
}
void Node<int>::funA();
这时候你在main函数如果使用的是函数:Node<float>::funA()这时候编译器会报错,因为你没有这种类型的静态函数。
而且我们还得到一个比较有趣的结论:
如果我的定义是这样的,里面没有static函数的实现,但那是我们可以定义如Node<int> a;虽然我们的静态函数没有实现,得出来的结论就是,如果静态方法没有使用,那么他是不会生成的。你理解了吗?在静态函数在c++就好像定义的外部函数一样。但是非静态函数也可以,也就是说c++中的任何函数在真是实现中都是c的形式,只不过是名字不同而已,如果你在c++类中没有实现,他好像就是没有定义一个全局的函数而已,但是真正要用的时候才会去找,所以说,你在定义类的时候,只要你不使用他的方法,你的方法可以不实现。