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

本文详细介绍了C++中的静态成员函数,包括其定义、声明、实现和调用方式。强调了静态成员函数无法访问普通成员变量是因为没有this指针,并解释了其本质是带类域的全局函数,可用于线程回调。通过实例展示了静态成员函数的使用,如直接通过类名调用,以及静态成员变量的访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上篇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:静态成员函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十月旧城

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

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

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

打赏作者

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

抵扣说明:

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

余额充值