为啥要使用类的静态成员函数
为什么要使用类的静态成员函数?
个人感觉静态成员函数能做的事,普通成员函数也能做。
那么为什么在某些类中要使用静态成员函数呢?
求解。
------解决方案--------------------
早起C++没有引入静态成员函数,但已经引入了静态成员变量。静态成员变量是为了在类级别上访问和该类而不是类对象有关的数据。位了某些设计目的(细节封装),需要把static data member设计成为private或者是protected。在这种情况下,在非子类中进行类域解析符进行static data member访问是做不到的。比如:
class A
{
private:
static int a;
};
A::a = 10;
std::cout << A::a;
像是这样的访问是不允许的。这需要通过一个本类的public方法进行访问,在那个时候由于还没有引入static member function,所以很多开发者使用如下的方式:
class A
{
private:
static int a;
public:
int& getA() { return a; }
};
A obj;
obj.getA() = 10;
std::cout << obj.getA();
甚至是比较geek的方法:
((A*)0)->getA();
不论是出于性能考虑,避免必须生成一个A的对象obj来访问a,还是出于安全性考虑,避免使用上面的geek方法访问a。对于可以直接访问static data member的function的提出,都是必要、合理的。因此,C++引入了static member function。这应该是它的主要考虑之一。
个人感觉静态成员函数能做的事,普通成员函数也能做。
那么为什么在某些类中要使用静态成员函数呢?
求解。
------解决方案--------------------
早起C++没有引入静态成员函数,但已经引入了静态成员变量。静态成员变量是为了在类级别上访问和该类而不是类对象有关的数据。位了某些设计目的(细节封装),需要把static data member设计成为private或者是protected。在这种情况下,在非子类中进行类域解析符进行static data member访问是做不到的。比如:
class A
{
private:
static int a;
};
A::a = 10;
std::cout << A::a;
像是这样的访问是不允许的。这需要通过一个本类的public方法进行访问,在那个时候由于还没有引入static member function,所以很多开发者使用如下的方式:
class A
{
private:
static int a;
public:
int& getA() { return a; }
};
A obj;
obj.getA() = 10;
std::cout << obj.getA();
甚至是比较geek的方法:
((A*)0)->getA();
不论是出于性能考虑,避免必须生成一个A的对象obj来访问a,还是出于安全性考虑,避免使用上面的geek方法访问a。对于可以直接访问static data member的function的提出,都是必要、合理的。因此,C++引入了static member function。这应该是它的主要考虑之一。