C++ static静态成员函数
在类中,static 除了可以声明静态成员变量,还可以声明静态成员函数。普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员。
编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 this,它不需要当前对象的地址,所以不管有没有创建对象,都可以调用静态成员函数。
普通成员变量占用对象的内存,静态成员函数没有 this 指针,不知道指向哪个对象,无法访问对象的成员变量,也就是说静态成员函数不能访问普通成员变量,只能访问静态成员变量。
普通成员函数必须通过对象才能调用,而静态成员函数没有 this 指针,无法在函数体内部访问某个对象,所以不能调用普通成员函数,只能调用静态成员函数。
静态成员函数与普通成员函数的根本区别在于:普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。
通过静态成员函数来获得学生的总人数和总成绩:
#include <iostream>
using namespace std;class Student{public:Student(char *name, int age, float score);void show();
public: //声明静态成员函数static int getTotal();static float getPoints();
private:static int m_total; //总人数static float m_points; //总成绩
private:char *m_name;int m_age;float m_score;
};int Student::m_total = 0;
float Student::m_points = 0.0;Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){m_total++;m_points += score;
}
void Student::show(){cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
}
//定义静态成员函数
int Student::getTotal(){return m_total;
}
float Student::getPoints(){return m_points;
}int main(){(new Student("张三", 15, 90.6)) -> show();(new Student("李四", 16, 80.5)) -> show();(new Student("王五", 16, 99.0)) -> show();(new Student("赵六", 14, 60.8)) -> show();int total = Student::getTotal();float points = Student::getPoints();cout<<"当前共有"<<total<<"名学生,总成绩是"<<points<<",平均分是"<<points/total<<endl;return 0;
}
运行结果:
张三的年龄是15,成绩是90.6
李四的年龄是16,成绩是80.5
王五的年龄是16,成绩是99
赵六的年龄是14,成绩是60.8
当前共有4名学生,总成绩是330.9,平均分是82.725
总人数 m_total 和总成绩 m_points 由各个对象累加得到,必须声明为 static 才能共享;getTotal()、getPoints() 分别用来获取总人数和总成绩,为了访问 static 成员变量,我们将这两个函数也声明为 static。
在C++中,静态成员函数的主要目的是访问静态成员。getTotal()、getPoints() 当然也可以声明为普通成员函数,但是它们都只对静态成员进行操作,加上 static 语义更加明确。
和静态成员变量类似**,静态成员函数在声明时要加 static,在定义时不能加 static**。静态成员函数可以通过类来调用(一般通过类来进行调用),也可以通过对象来调用。
C++ static静态成员函数相关推荐
- C++ static静态成员函数详解
在类中,static 除了可以声明静态成员变量,还可以声明静态成员函数.普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员. 编译器在编译一个普通成员函数时,会隐式地 ...
- C++ static静态成员函数小结
在C++的类中,static 除了可以声明静态成员变量,还可以声明静态成员函数.普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员. 1.静态成员函数可以通过类直接调 ...
- C++学习10 static静态成员变量和静态成员函数
一般情况下,如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干.但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享. 可以使用全局 ...
- 深入解析C++编程中的静态成员函数
这篇文章主要介绍了深入解析C++编程中的静态成员函数,是C++入门学习中的基础知识,需要的朋友可以参考下 C++静态成员函数 与数据成员类似,成员函数也可以定义为静态的,在类中声明函数的前面加stat ...
- C++之类的静态成员变量和静态成员函数
static静态成员函数 在类中.static 除了声明静态成员变量,还能够声明静态成员函数. 普通成员函数能够訪问全部成员变量.而静态成员函数仅仅能訪问静态成员变量. 我们知道.当调用一个对象的成员 ...
- C++之静态成员变量和静态成员函数
静态成员变量 关键字 static 可以用于说明一个类的成员, 静态成员提供了一个同类对象的共享机制 把一个类的成员说明为 static 时,这个类无论有多少个对象被创建,这些对象共享这个 stati ...
- 为什么静态static成员函数不能成为virtual虚函数
首先什么是static静态成员函数?静态成员函数不属于类中的任何一个对象和实例,属于类共有的一个函数.也就是说,它不能用this指针来访问,因为this指针指向的是每一个对象和实例. 对于virtua ...
- C++ 静态成员变量与静态成员函数
一.静态成员变量 1)定义静态成员变量 关键字 static 可以用于说明一个类的成员,静态成员提供了一个同类对象的共享机制 把一个类的成员说明为 static 时,这个类无论有多少个对象被创 ...
- 类中的静态成员变量和静态成员函数
static静态成员函数 1.static 修饰成员变量 2.static修饰静态成员函数 引子: 静态成员函数: 注意: 3.const 修饰静态成员 静态成员案例 案例1:静态成员 统计类 实例化 ...
最新文章
- 我的第一个 JSP (SSH) 个人网站【开源】
- golang sqlite数据库 rows.Close()造成 错误database is locked
- 基于Boost::beast模块的协程HTTP服务器
- Android doc译文|Building Apps with Content Sharing|Sharing Simple Data
- Android学习_ContentProvider和Uri
- 10.程序员的自我修养---内存
- linux centos系统清理垃圾,centos 清理内存缓存
- 【手记】解决Intel Management Engine Interface黄色感叹号
- call、aplay 和 bind 三者之间的区别?
- 2020vue面试题汇总
- 基于深度学习的Depth and Ego-Motion Estimation
- Day9-Python文本数据(DataWhale)
- 【剑指offer】一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- 抽象类和抽象方法_30酷抽象和背景Photoshop教程
- C++寻找数组最大值和最小值
- “啪”一炮就通!管道疏通神器终于诞生,马桶、下水道再也不怕堵!
- Ubuntu20.04网络配置
- CCF-CSP201812-1 小明上学
- 华大(现在改名小华半导体)芯片启动文件详细讲解
- 【MYSQL数据库基础篇第一部分总结】
热门文章
- PP视频如何设置关闭的时候直接退出程序
- 解决Springboot get请求是参数过长的情况
- Mybatis源码分析之(三)mapper接口底层原理(为什么不用写方法体就能访问到数据库)
- mysql——decimal类型与decimal长度
- 使用Collections.emptyList()生成的List不支持add方法___Java Collections.emptyList方法的使用及注意事项
- SpringBoot中使用Shiro和JWT做认证和鉴权
- springboot整合mybatisplus中@Mapper与@MapperScan的使用
- jmeter生成html报告修改,Jmeter生成html报告(示例代码)
- hough变换直线检测_python+opencv实现霍夫变换检测直线
- C语言的VC开发环境界面介绍,【c语言在vc++6.0中编写界面程序】