static在C语言中的作用,简要地说就是为了让同名的变量或函数在各个文件之间彼此隔绝,打消他们之间的互相影响。而在C++中,static除了这样的作用之外,还多了一项非常重要的功能——定义类的属性和行为,这是基于对象程序设计的一个不可或缺的要素。
所谓的static静态成员,就是类似下面这样的东西:
classkitty
{
public:
staticintcount;
doublwight;
staticintgtCount(){rturncount;}
voidat();
};
上面的count和gtCount()就是静态成员数据和静态成员方法,我们掌握这静态成员分两步走:第一,彻底搞清楚语法细节。第二,彻底搞清楚内在涵义。
来第一步。
静态数据必须在类外初始化(const型数据除外),未初始化的话不能访问。这个跟C语言中的静态变量不同(静态变量未初始化的话会被自动初始化为0,还记得吗?),上述的count可以在类外初始化,像这样:
intkitty::count=0;
类外初始化时,不能指定static关键字(static修饰静态成员只能放在类内部),另外还需加上域解析符(kitty::)。
静态方法gtCount()的定义区域比较宽松,既可以在类内部,也可以在类外部。但是静态方法只能引用静态数据,只能调用其他静态方法,比如上面的示例中,gtCount()方法只能访问count数据,访问其他的非静态数据或者调用其他的非静态方法都会报错。
静态数据和静态成员都可以被对象引用(当然必须是public权限模式才可以),但是要记住,所有的对象共用这些静态数据和方法,也就是说,一个对象如果可以直接修改某个静态数据,那么其他对象是立即可见的。
使用域解析符来引用静态成员,比如:
kitty::count;
kitty::gtCount();
使用类对象来引用静态成员,比如:
kittycutCat;
cutCat.count;
cutCat.gtCount();
以上就是静态类成员的语法点,记下他们是必须的,但对你设计程序代码并不会有多大的帮助,因为学习编程并不是为了考试,你必须理解这些语义机制背后的逻辑和内涵,只有那样他们才能为你所用,才能成为你私人武器库中的又一把利刃。
静态成员的内在涵义就是:他们是属于整个类的属性和行为,而不依存于任何一个具体的个体。比如当你在设计猫咪(kitty)这个类的时候,你想要统计所有猫咪的总数count,这个数值是整体属性,不依存于任何一只猫咪。
我们可以在不创建任何具体对象的情况下,引用静态成员,比如我身边一只猫也没有,但我依然可以询问猫咪的总数gtCount(),但我绝不能询问猫咪的重量,也无法发起“吃”这样的行为。这就解释了为什么静态方法不能引用非静态成员的原因。
总之,厘清一个语法概念背后的逻辑内涵是更重要的,脱离了这个,记再多的语法也是白扯。后续的编程语言类文章,都遵循这个思路。
点击左下角阅读原文,没时间,快点上车!
死磕自己,愉悦大家!
赞赏
人赞赏
白癜风的早期症状都有哪些北京专治疗白癜风的医院