静态数据成员(C++)
目录
一、静态数据成员
1.1、定义
1.2、声明
1.3、初始化
1.4、普通访问
1.5、对象访问
二、静态成员函数
一、静态数据成员
1.1、定义
我们都知道,类是对具有相同属性和相同行为的一组对象的描述。
有时侯,我们希望每定义一个对象,调用一次构造函数,其中有一些数据成员被所有对象共享,但是我们知道,类中的数据成员是每个对象所私有的,那么我们该如何使用一个数据让所有对象共享它呢?一个办法是将其定义为全局变量,这样就可以达到让多个数据对象共享的目的,但是全局变量的引入会带来不安全性,并且破坏了面向对象程序设计的信息隐蔽技术,与面向对象的封装性特点是矛盾的。为了实现同一个类中多个对象之间的数据共享,C++提出了静态数据成员的概念。
1.2、声明
在一个类中,若将一个数据成员说明为static,这种成员成为静态数据成员。与一般的数据成员不同,无论建立多少个类的对象,都只有一个静态数据成员的拷贝,从而实现了一个类的不同对象之间的数据共享。
定义静态数据成员的格式如下:(我们以classA为例,以下都是)
static 数据类型 数据成员名;
static int x;
1.3、初始化
注意:静态数据成员的初始化与普通数据成员的初始化不同,静态数据成员的初始化应在类外单独进行,并且应在定义对象之前进行。一般在主函数main之前。类声明之后的特殊地带为它提供定义和初始化,初始化格式如下:
数据类型 类名::静态数据成员名=初始化值;注意这里不要加static关键字。
int classA::x=0;
1.4、普通访问
静态数据成员属于类,(准确的说是属于类对象的集合)而不像某一个数据成员那样属于一个对象,因此可以使用"类名::",访问静态数据成员,用类名访问静态数据成员的格式如下:
类名::静态数据成员名
cout<<classA::x<<endl;
1.5、对象访问
静态数据成员与静态变量一样,是在编译时创建并初始化,它在该类的任何对象创建前就存在。因此共有的静态数据成员可以在对象创建之前被访问,对象定义后,公有的静态数据成员,也可以通过对象进行访问,访问格式如下:
对象名.静态数据成员名;
对象指针->静态数据成员名;
classA A;
A.x;
A->x;
注意:私有的静态数据成员不能在类外直接访问,必须通过公有的成员函数访问。
class A {
private:int x;int y;int h;static int z;
public:A(int a,int b);~A();void show1();void show2();static void print();
};
A::A(int a,int b) {x = a;y = b;h = a + b;++z;
}
A::~A() {}
void A::show1() {cout <<"x = "<< x << endl;cout <<"y = "<< y << endl;cout << "h= " << h << endl;
}
void A::show2() {cout << "次数为 "<<z << endl;//cout << "次数为 " << A::z << endl;//两种访问方式都可以
}
int A::z = 0;
int main() {A a(2, 2);a.show1();a.show2();A b(2, 3);A* p;p = &b;p->show1();(*p).show2();b.show1();b.show2();return 0;
}
测试用例:
二、静态成员函数
在类的定义中,前面有static说明的成员函数称为静态成员函数。静态成员函数属于整个类,是该类所有对象共享的成员函数,而不是属于类中的某个对象。定义静态成员函数的格式如下:
static 返回值类型 静态成员函数名(参数表);
与静态数据成员类似,调用公有静态成员函数的一般格式有如下几种:
类名::静态成员函数名(参数表);
对象.静态成员函数名(参数表);
对象->静态成员函数名(参数表);
例:
static int fun(int a,int b);classA::fun(int a,int b);classA A;
A.fun(int a,int b);
A->fun(int a,int b);
静态数据成员函数与非静态成员函数的重要区别是:非静态成员函数有this指针,而静态成员函数没有this指针。静态成员函数可以直接访问本类的静态数据成员,因为静态数据成员同样是属于类,可以直接访问。一般而言,静态成员函数不能访问类中的非静态数据成员,若确实需要访问非静态数据成员,静态成员函数只能通过对象名(对象指针或对象引用)访问该对象的非静态数据成员。例如:
class A {
private:int x;static int y;
public:A(int a);~A();void print();static void fun(A& a);static void fun1(A* p);static void show();
};
A::A(int a) {x = a;y++;
}
A::~A(){}
void A::print() {//普通成员函数调普通数据成员与静态数据成员cout << "x= " <<x<< endl;cout << "y= " <<y<< endl;
}
void A::fun(A& a) {//静态成员函数调普通数据成员cout << "x1= " << a.x << endl;
}
void A::fun1(A* p) {//这里指针方式就演示这一个哈cout << "x2= " << p->x<< endl;
}
void A::show() {//静态成员函数调静态数据成员cout <<"次数为y= "<< y << endl;
}
int A::y = 0;
int main() {A a(1), b(2), c(3);A* p;p = &a;a.print();b.print();c.print();A::fun1(&a);A::fun1(p);p->fun1(&a);p->fun1(p);(*p).fun1(&a);A::fun(a);A::fun(b);A::fun(c);A::show();return 0;
}
这里提供了多种调用方式,测试用例:
静态数据成员(C++)相关推荐
- c++对象长度之静态数据成员(3)
当类中定义了静态数据成员.当类中定义了静态数据成员时,由于静态数据成员与静态变量原理相同(是一个含有作用域的特殊全局变量),因此该静态数据成员的初值会被写入编译链接后的执行文件中.当程序被加载时,操作 ...
- C++静态数据成员和静态成员函数
在C++面向对象编程过程当中,对象与对象之间的数据不是共享,在设计类的时候,有时候需要一些对象之间共享的数据,除了把所要共享的数据设置为全局数据或者函数之外,还可以利用C++的静态机制. 1.静态数据 ...
- Qt使用导出类报错:error C2491: “ZMapWidget::staticMetaObject”: 不允许 dllimport 静态数据成员 的定义
在使用一个继承自QObject带有Q_OBJECT宏的导出类时,编译报错:不允许 dllimport 静态数据成员 的定义. 原因是自动生成的moc文件带有静态函数,无法导出. 1.在Qt中的解决办法 ...
- c++远征之模板篇——静态数据成员,静态成员函数
以下内容源于慕课网的学习整理,如有侵权,请告知删除. 1.静态数据成员 (1)不同于普通的数据成员,静态数据成员在没有实例化时,它也是存在的(即它是和类共存的): (2)它一般不依赖于构造函数的初始化 ...
- 【C++基础学习】关于C++静态数据成员
静态类成员包括静态数据成员和静态函数成员两部分. 一. 静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员.和其他数据成员一样,静态数据成员也遵守pu ...
- c语言类静态数据成员函数,鸡啄米:C++编程入门系列之二十一(C++程序设计必知:类的静态成员)...
鸡啄米在上一讲数据和函数中讲到,函数之间共享数据也就是此函数访问彼函数的数据主要是通过局部变量.全局变量.类的数据成员.类的静态成员及友元实现的,前三个已经讲过了,这一讲鸡啄米来讲讲静态成员.静态成员 ...
- C++静态数据成员与静态函数(案例分析)
文章目录 一.静态数据成员 二.静态函数 一.静态数据成员 #include <iostream> using namespace std;class Box {public:Box(in ...
- C++类的静态数据成员-关键字static
C++类的静态数据成员-关键字static 定义:用static关键字声明的数据成员称为静态数据成员. 每个类只有一个存储单元,静态数据成员为该类的所有对象共有,不属于某个对象.静态数据成员的初始化必 ...
- 静态数据成员与静态成员函数
3-6 静态数据成员与静态成员函数 Time Limit: 1000MS Memory limit: 65536K 题目描述 通过本题目的练习可以掌握静态数据成员和静态成员函数的用法 要求设计一个点类 ...
- qt 不允许 dllimport 静态数据成员 的定义_C++类和对象的定义
想用机器人赋能未来,少不了扎实的编程基本功,让我们跟着清华大学的C++语言程序课程一起过一遍C++的语法知识吧! C++语言特点--面向对象的程序设计 对象是现实中的对象在程序中的模拟,类是同一类对象 ...
最新文章
- HTTP 加速器 Varnish
- 连接远程mysql遇到的问题及解决方法
- Oracle_双机备份_资料
- R pdf大小_「福昕PDF助手」12个常用的Word快捷键,一看就会,你值得拥有!
- 一个简单的Android客户端从服务器端获取json数据并解析的实现代码
- vue.js 源代码学习笔记 ----- decoder
- C++面试题-指针-指针数组与数组指针
- 《javascript高级程序设计》核心知识总结
- apk加壳加密工具(apk protect) v1.0下载
- GridView样式设置
- 主板插线接口大全图解
- 信息安全概论———网络安全协议
- 6步讲解应对ESD基本方法
- MSSQL 负载均衡(Moebius)
- 从3D ToF到智能座舱系统方案,英飞凌如何赋能未来出行?
- html请假条源码,请假条(事假) 的例子
- 高等数学笔记-苏德矿-第十章-曲线积分和曲面积分-第七节-高斯公式与斯托克斯公式
- 生物信息学算法之Python实现|Rosalind刷题笔记:003 中心法则:翻译
- CSDN的会员等级和推荐卡规则
- AX7A200教程(3): DDR3突发读写