-:静态成员
静态成员函数或者是静态成员,其都是属于类的;而不是属于类的对象的。然后因为静态成员是不与任何对象绑定
在一块的,所以静态成员函数不包括this指针的。因此静态成员函数是不能声明成const的,而且我们也不能在static
函数体内使用this指针。这一限制既适用于this的显示使用,也对调用非静态成员的隐式使用有效。(也就是说,静态成
员函数是不可以调用普通的成员函数的,也不可以调用普通的成员的。只能调用静态的成员或者静态成员函数)。
我们使用作用域运算符直接访问静态成员:
class A{
public:
void calculate(){amount += amount*interestRate;}
static double rate(){return interestRate;}
static void rate(double);
private:
std::string owner;
double amount;
static double interestRate;
static double initRate();
};
double r;
r = A::rate(); //使用作用域运算符访问静态成员
二:定义和初始化静态成员
和其他成员函数一样,我们既可以在了类的内部也可以在类的外部定义静态成员函数。当在类的外部定义静态成员时,不能重复static
关键字,该关键字只能出现在类内部的声明语句:
void A::rate(double newRate){
interestRate = newRate;
}
注意:和类的所有成员一样,当我们指向类外部的静态成员时,必须指明成员所属的类名。static关键字则只出现在类内部的声明语句中。
因为静态数据成员不属于类的任何一个对象,所以它们并不是在创建类的对象时被定义的。这意味着他们不是由类的构造函数初始
化的。而且一般来说,我们不能在类的内部初始化静态成员。相反的,必须在类的外部定义和初始化每个静态成员。和其他对象一样,一
个静态数据成员只能定义一次。
我们定义静态数据成员的方式和在类的外部定义成员函数差不多。我们需要指定对象的类型名,然后是类名,作用域运算符以及成
员自己的名字:
//定义并初始化一个静态成员
double A::interestRate = initRate();
这条语句定义了名为interesRate的对象,该对象是A的静态成员,其类型是double。从类名开始。这条定义语句的剩余部分就都位于
类的作用域之内了。因此,我们可以直接使用initRate函数。虽然其是私有的成员函数。
通常情况下,类的静态成员不应该在类的内部初始化。然而,我们可以为静态成员提供const整数累的类内初始值,不过要求静
态成员必须是字面值常量类型的constexpr。初始值必须是常量表达式,因为这些成员本身就是常量表达式,所以它们能用在所有
适合于常量表达式的地方。
class A{
public:
static double rate(){return interestRate;}
static void rate(double);
private:
static constexpr int period = 30;//period是常量表达式
double daily_tbl[period];
};
注意:类的静态成员一定要初始化!!!!!
三:初始化静态成员函数指针:
void number(int n){
return n;
}
class B{
public:
static void (*p)(int number);
.....
};
void (*B::p)(int number) = number;
注意:所有的静态成员一定要初始化,而且注意这个函数指针初始化的形式void (*B::p)(int number)。
四:如果出现你调用的静态成员函数出现如下错误:
undefined reference to `linkedBinaryTree<booster>::visit'
这种情况下就是表示你没有对你的静态成员函数进行初始化,所以你必须对静态成员函数进行初始化!!!