0x00 前言
文章中的文字可能存在语法错误以及标点错误,请谅解;
如果在文章中发现代码错误或其它问题请告知,感谢!
本文档为个人边学习边记录的C++笔记,非教程,笔记中会存在引用他人文章内容的部分,被引用的原文不会被特殊标记出来,但会在参考文档中给出原文链接。
0x01 静态数据成员以及静态函数成员
1.静态数据成员
如果某个属性为整个类所共有,不属于任何一个具体对象,则采用static
关键字来声明为静态成员
。
静态成员在每个类只有一个副本,由该类的所有对象共同维护和使用,从而实现了同一类的不同对象之间的数据共享。
类属性是描述类的所有对象共同特征的一个数据项,对于任何对象实例,它的属性值是相同的。
静态数据成员具有静态生存期。由于静态数据成员不属于任何一个对象,因此可以通过类名对它进行访问,一般用法是类名::标识符
。
在类的定义中仅仅对静态数据成员进行引用性声明,必须在命名空间作用域的某个地方使用类名限定定义性声明,这是也可以进行初始化(类的静态数据成员需要在类定义之外再定义是因为需要以这种方式专门为它们分配空间,非静态数据成员的空间与其所属的对象的空间同时分配)。
在UML语言中,静态数据成员通过在数据成员下方添加下划线来表示。
例:具有静态数据成员的Point类。
#include<iostream>
using namespace std;
class Point{
public:
Point(int x = 0, int y = 0):x(x), y(y){
count++;
}
Point(Point &p){
x = p.x;
y = p.y;
count++;
}
~Point(){
count--;
}
static void Count();
int getX(){
return x;
}
int getY(){
return y;
}
void showCount(){
cout<<"Object count = "<<count<<endl;
}
private:
int x, y;
static int count;
};
void Point::Count(){
cout<<"Init Count is "<<count<<endl;
}
int Point::count = 0;
int main(){
Point a(4, 5);
cout<<"Point A:"<<a.getX()<<","<<a.getY();
a.showCount();
Point b(a);
cout<<"Point B:"<<b.getX()<<","<<b.getY();
b.showCount();
return 0;
}
运行结果如下:
Point A:4,5Object count = 1
Point B:4,5Object count = 2
2.静态函数成员
静态成员函数可以直接访问该类的静态数据和函数成员。而访问非静态成员,必须通过对象名。例如:
class A{
public:
static void f(A a);
private:
int x;
};
void A::f(A a){
cout << x; //对x的引用是错误的
cout << a.x; //正确
}
通过静态函数成员方位非静态成员是相当麻烦,一般情况下,它主要用来访问同一个类中的静态数据成员,维护对象之间共享的数据。
之所以在静态成员函数中访问类的非静态成员需要指明对象,是因为对静态成员函数的调用时没有目的对象的,因此不能像非静态成员函数那样,隐含的通过目的对象访问类的非静态成员。
在UML中,静态函数成员是通过在函数成员添加<<static>>
构造来表征。
例:具有静态数据和函数成员的Point类。
#include <iostream>
using namespace std;
class Point{
public:
Point(int x = 0, int y = 0):x(x), y(y){
count ++;
}
Point(Point &p){
x = p.x;
y = p.y;
count++;
}
~Point(){count--;}
int getX(){return x;}
int getY(){return y;}
static void showCount(){
cout << "Object count =" << count << endl;
}
private:
int x, y;
static int count;
};
int Point::count = 0;
int main() {
Point a(4, 5);
cout << "Point A:" << a.getX() <<"," << a.getY();
Point::showCount();
Point b(a);
cout << "Point B:" << b.getX() << "," << b.getY();
Point::showCount();
return 0;
}
与上例相比,将类中showCount改写成静态成员函数,于是在主函数中介可以使用类名也可以使用对象名来调用showCount。
《C++语言程序设计(第4版)》书上所有章节出现的示例源代码随着学习的深入会陆续上传至github,代码为个人手动输入并通过编译,有的示例代码可能没有注释:https://github.com/fyw4/C-plus-plus-learning-example
以上。
参考文档:
郑莉 董渊 何江舟.《C++语言程序设计(第4版)》[M].北京:清华大学出版社。