C++57个入门知识点_43:静态成员函数(static静态成员函数声明,实现和调用;静态函数内部只能访问静态成员变量;本质是静态成员函数没this指针;带类域的全局函数可直接利用类调用静态成员函数)

上篇C++57个入门知识点_42:静态成员变量理解(static int m_nStatic;实现单独写在类外;本质是带类域的全局变量;可以不用产生对象即可访问CInteger::m_nStatic=1)介绍了静态成员变量,本篇将会介绍静态成员函数,static关键字不仅可以修饰静态成员变量,还可以修饰成员函数。

静态成员函数总结:

  1. 静态成员函数的定义:
  • 静态成员函数声明:static void foo();
  • 静态成员函数实现:void CInteger::foo(){ printf("CInteger::foo()"); }
  • 静态成员函数的调用:生成对象进行调用,CInteger i = 1; i.foo();
  1. 静态函数内部不能访问普通成员变量,只能访问静态成员变量;

  2. 静态成员函数无法访问普通成员变量的本质是静态成员函数中没有this指针;

  3. 静态成员函数本质上就是带类域的全局函数,可以直接利用类调用静态成员函数,并避免名称冲突的问题;

  4. 利用静态成员函数中没有this指针的本质,在线程及回调函数中会用到静态成员函数,用作线程的回调函数的声明。

1. 静态成员函数的定义

本篇还是在上篇代码的基础上,对代码进行修改。项目结构如下:
在这里插入图片描述

  • 静态成员函数声明:static void foo();

CIntreger.h

class CInteger
{
public:
	CInteger(int nNumber) {
		m_nNumber = nNumber;
	}

	int GetNumber()const;
	void SetNumber(int nNumber) {
		m_nNumber = nNumber;
	}
	
	static void foo();

	static int m_nStatic;

private:
	int m_nNumber;
};
  • 静态成员函数实现:void CInteger::foo(){ printf("CInteger::foo()"); }

CIntreger.cpp

#include "CIntreger.h"
#include <iostream>

int CInteger::GetNumber()const
{
	return m_nNumber;
}

int CInteger::m_nStatic = 123;

void CInteger::foo()
{
printf("CInteger::foo()");
}
  • 静态成员函数的调用:生成对象进行调用,CInteger i = 1; i.foo();

testCPP.cpp

#include <iostream>
#include "CIntreger.h"

int main()
{
	CInteger i = 1;

	i.foo();
	
	return 0;
}

2. 函数内部不能访问普通成员变量,只能访问静态成员变量

  • 在静态成员函数内部调用类的普通成员变量,显示错误
void CInteger::foo()
{
printf("CInteger::foo()");
m_nNumber = 1;//编译后显示对非静态成员“CInteger::m_nNumber”的非法引用
}

运行结果:
在这里插入图片描述

  • 在静态成员函数内部调用类的静态成员变量,编译正常
void CInteger::foo()
{
printf("CInteger::foo()");
m_nStatic = 2;
}

3. 静态成员函数无法访问普通成员变量的本质

出现上面的原因是:静态成员函数中没有this指针,导致无法访问普通成员变量m_nNumber,而m_nStatic不属于某个对象,而是属于类的,因此可以直接访问

成员函数是所有对象所所共有的,为了指明调用成员函数的对象,因此成员函数中会默认多一个对象的参数,这是我们所看不到的。参考C++57个入门知识点_18_ 类的大小+成员函数性质+this指针(类大小由成员变量决定;类对象数据独立,成员函数共用;this指针:谁创建指向谁,谁使用成员函数指向谁;类成员函数指针写法及调用)

void CInteger::foo()
{
printf("CInteger::foo()");
m_nStatic = 2;

void* p = this;//报错:“this”只能用于非静态成员函数内部;只能在非静态成员函数或非静态数据成员初始值设定项的内部引用
}

编译结果:
在这里插入图片描述

4. 静态成员函数本质上就是带类域的全局函数,可以避免名称冲突的问题

与静态成员变量相似,静态成员函数不依赖于对象,因此在对象不存在的情况下也是可以进行访问的。

int main()
{
	CInteger i = 1;

	i.foo();

	//因为静态成员函数没有this指针,因此也不需要依赖对象,故可以写成如下:
	CInteger::foo();

	//不用创建对象就可以创建静态变量,因为它是与类相关的,一个类有一个
	//属于类而不单属于某个对象,是类公有的
	//CInteger::表示在类域范围内
	CInteger::m_nStatic = 1;

	return 0;
}

5.学习视频地址:C++57个入门知识点_43:静态成员函数

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
谭浩强教授,我国著名计算机教育专家。1934年生。1958年清华大学毕业。学生时代曾担任清华大学学生会主席、北京市人民代表。他是我国计算机普及和高校计算机基础教育开拓者之一,现任全国高等院校计算机基础教育研究会会长、教育部全国计算机应用技术证书考试委员会主任委员。 谭浩强教授创造了3个世界纪录:(1)20年来他(及和他人合作)共编著出版了130本计算机著作,此外主编了250多本计算机书籍,是出版科技著作数量最多的人。(2)他编著和主编的书发行量超过4500万册,是读者最多的科技作家。我国平均每30人、知识分子每1.5人就拥有1本谭浩强教授编著的书。(3)他和别人合作编著的《BASIC语言》发行了1200万册,创科技书籍发行量的世界纪录。此外,他编著的《C程序设计》发行了600万册。他曾在中央电视台主讲了BASIC,FORTRAN,COBOL,Pascal,QBASIC,C,Visual Basic七种计算机语言,观众超过300万人。 在我国学习计算机的人中很少有不知道谭浩强教授的。他善于用容易理解的方法和语言说明复杂的概念。许多人认为他开创了计算机书籍贴近大众的新风,为我国的计算机普及事业做出了重要的贡献。 谭浩强教授曾获全国高校教学成果国家级奖、国家科技进步奖,以及北京市政府授予的“有突出贡献专家”称号。《计算机世界》报组织的“世纪评选”把他评为我国“20世纪最有影响的IT人物”10个人之一(排在第2位)。他的功绩是把千百万群众入计算机的大门。 1 C语言概述 1.1 C语言的发展过程 1.2 当代最优秀的程序设计语言 1.3 C语言版本 1.4 C语言的特点 1.5 面向对象的程序设计语言 1.6 C和C++ 1.7 简单的C程序介绍 1.8 输入和输出函数 1.9 C源程序的结构特点 1.10 书写程序时应遵循的规则 1.11 C语言的字符集 1.12 C语言词汇 1.13 Turbo C 2.0 集成开发环境的使用 1.13.1 Turbo C 2.0 简介和启动 1.13.2 Turbo C 2.0 集成开发环境 1.13.3 File菜单 1.13.4 Edit 菜单 1.13.5 Run 菜单 1.13.6 Compile 菜单 11.13.7 Project 菜单 1.13.8 Options菜单 1.13.9 Debug 菜单 1.13.10 Break/watch 菜单 1.13.11 Turbo C 2.0 的配置文件 2 程序的灵魂—算法 2.1 算法的概念 21 2.2 简单算法举例 21 2.3 算法的特性 24 2.4 怎样表示一个算法 24 2.4.1 用自然语言表示算法 24 2.4.2 用流程图表示算法 24 2.4.3 三种基本结构和改进的流程图 28 2.4.4 用N-S 流程图表示算法 29 2.4.5 用伪代码表示算法 30 2.4.6 用计算机语言表示算法 31 2.5 结构化程序设计方法 31 3 数据型、运算符与表达式 3.1 C语言的数据型 32 3.2 常量与变量 33 23.2.1 常量和符号常量 33 3.2.2 变量 33 3.3 整型数据 34 3.3.1 整型常量的表示方法 34 3.3.2 整型变量 35 3.4 实型数据 37 3.4.1 实型常量的表示方法 37 3.4.2 实型变量 38 3.4.3 实型常数的型 39 3.5 字符型数据 39 3.5.1 字符常量 39 3.5.2 转义字符 39 3.5.3 字符变量 40 3.5.4 字符数据在内存中的存储形式及使用方法 41 3.5.5 字符串常量 41 3.5.6 符号常量 42 3.6 变量赋初值 42 3.7 各数值型数据之间的混合运算 43 3.8 算术运算符和算术表达式 44 3.8.1 C运算符简介 44 3.8.2 算术运算符和算术表达式 45 3.9 赋值运算符和赋值表达式 47 33.10 逗号运算符和逗号表达式 48 3.11 小结 49 3.11.1 C的数据型 49 3.11.2 基本型的分及特点 49 3.11.3 常量后缀 49 3.11.4 常量型 49 3.11.5 数据型转换 49 3.11.6 运算符优先级和结合性 50 表达式 50 4 最简单的 C程序设计—顺序程序设计 4.1 C语句概述 51 4.2 赋值语句 53 4.3 数据输入输出的概念及在 C 语言中的实现 54 4.4 字符数据的输入输出 54 4.4.1 putchar 函数(字符输出函数) 54 4.4.2 getchar函数(键盘输入函数) 55 4.5 格式输入与输出 55 4.5.1 printf 函数(格式输出函数) 56 4.5.2 scanf函数(格式输入函数)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值