访问静态数据成员,一般来说,先创建一个对象,对象捆绑一个成员函数,去操作静态数据成员。
难道对象不存在时就不能观察静态数据成员了吗?
因此,与数据成员一样,将静态成员做成私有的,用静态成员函数去访问静态数据成员是合适的。
//---------main.cpp------------
#include <iostream>
#include <string>
using namespace std;
class Student
{
private:
static int number;
string name;
public:
void set(string str)
{
name = str;
number++;
}
static void printNumber(){std::cout<<"number is :"<<number<<endl;}
void print() {std::cout<<"name :" << name <<" number is :"<<number<<endl;}
};
int Student::number = 0; //静态数据成员在类外分配空间和初始化,定义静态成员的格式不能重复使用static,必须加类名和域操作将其初始化
void fn()
{
Student s1;
s1.set("A");
Student s2;
s2.set("B");
s1.printNumber();
}
int main(int argc,char **argv)
{
Student s;
s.set("C");
fn();
s.print();
Student::printNumber(); //不用创建一个多余的对象来达到访问静态成员的目的
return 0;
}
A is :3
name :C number is :3
number is :3
请按任意键继续. . .
静态成员函数不受对象的牵制,可以用对象名调用静态成员函数,也可以用类名加上域操作调用静态成员函数,这时候,也将它看做是某个名空间的一个函数。
静态成员函数如果不在类中实现,而在类的外部实现时,类名前应该免去static关键字。成员函数的静态性只有在类中声明才是必要的。
因为静态成员函数可以不捆绑对象的形式调用,静态成员函数被调用时,没有当前对象的信息,所以静态成员函数不能访问数据成员。
如:
static void printNumber(){std::cout<<name<<number<<endl;}
则编译通不过。并不是说它没有访问私有数据的权限。
如:
static void printNumber(Student &s)
{
std::cout<<"the name is : "<<s.name<<" total number is : "<<s.number<<endl;
}
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">1</span>