写点什么

静态成员函数访问非静态数据成员【C++】

作者:攻城狮杰森
  • 2022 年 7 月 18 日
  • 本文字数:1133 字

    阅读完需:约 4 分钟

静态成员函数访问非静态数据成员【C++】

静态数据成员


定义格式:


static 类型名 静态数据成员名 ;


详解:由于静态数据成员属于本类的所有对象共享,不属于特定类对象,因此在未产生类对象时作用域就可见,即:在未产生类的实例时,就可以对它进行操作。


初始化:


类型 类名 :: 静态数据成员 = 初始化值 ;


详解:静态数据成员必须在类外初始化,不可在类体内,因为:构造函数中,如果可以,则每次建立对象,都会对静态数据成员的值进行修改,这违背静态数据成员的使用目的;类内也不可以初始化,不要忘记,类只是一种数据类型,数据类型中怎么能赋初值呢?

静态成员函数

定义格式:


static 返回类型 静态成员函数名 (参数表) ;


调用方式:


类名 :: 静态成员函数名 (实参表) ;对象名 . 静态成员函数名 (实参表) ;


注意:


类外定义静态成员函数时,定义格式和普通成员函数定义格式相同,==不再使用 static 修饰==;使用对象名和成员运算符(.)调用成员函数时,并非该函数属于某一对象,只是类与对象间的桥梁,为了能处理静态数据成员;


静态成员函数不能==默认引用==本类非静态数据成员的原因:


当调用一个对象的非静态成员函数时,系统会将该对象的起始地址赋予成员函数的 this 指针。然而,静态成员函数不属于对象,无 this 指针。所以静态成员函数不能访问类的默认非静态成员(非静态成员函数和非静态数据成员)。


举例说明一种静态成员函数访问非静态数据成员的方式:


#include <iostream>using namespace std;
class Point {public: Point(int a) { //构造函数 x = a; y += x; } static void f1(Point m); //静态成员函数的原型声明private: int x; static int y; //静态数据成员};
void Point::f1(Point m) { //静态成员函数的类外定义 参数表中创建对象 cout << "x=" << m.x << endl; //静态成员函数通过对象访问非静态数据成员 cout << "y=" << y << endl; //静态成员函数处理静态数据成员}
int Point::y = 0; //静态数据成员初始化
int main() { Point P1(5), p2(10); Point::f1(P1); //静态成员函数调用时一般使用 类名:: Point::f1(p2); return 0;}
复制代码


程序运行结果:


x=5y=15x=10y=15
复制代码


对运行结果的分析,最后一次对静态数据成员 y 更新后,y=15 所以两次输出 y 的值都是 15。


只要对静态数据成员的值更新一次,就可以保证所有对象都会存取更新后的值


由本例可知:静态成员函数不能引用本类非静态成员并非绝对,只是不可以进行默认的访问,因为编译器不知道应该去寻找哪一个对象。若必须要访问,则有两种方式,且一般使用第二种居多。


对象名 . 非静态成员 ;类名 :: 非静态成员 ;


故:实例化对象即可完成对非静态数据成员的访问

发布于: 刚刚阅读数: 3
用户头像

#以梦为码,不负年华 2022.07.02 加入

目前计算机专业在读,阿里云专家博主,华为云云享专家,51CTO 博客专家,喜欢各类竞赛,熟悉 c/c++,java,html,css,javascript,python...竭力成为一名 Full Stack Developer. 关注杰森,与你同行,共同进步!

评论

发布
暂无评论
静态成员函数访问非静态数据成员【C++】_c++_攻城狮杰森_InfoQ写作社区