【C++学习笔记】静态数据成员以及静态函数成员

本文档介绍了C++中的静态数据成员和静态函数成员。静态数据成员为类的所有对象共享,通过类名进行访问,用于实现数据共享。静态函数成员可以直接访问静态数据成员,但访问非静态成员需通过对象。示例代码展示了如何声明、初始化和使用静态成员,以及它们在UML中的表示方式。
摘要由CSDN通过智能技术生成

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].北京:清华大学出版社。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值