首页 > 编程语言 >C++类中的静态成员

C++类中的静态成员

时间:2024-11-10 15:19:12浏览次数:3  
标签:变量 访问 静态 成员 C++ int 类中 函数

目录

1.静态成员变量:

2.静态成员函数

在C++中类中的静态成员分为两类,一类是静态成员变量,一类是静态成员函数。什么是静态成员变量和静态成员函数呢?就是在前面加static关键字。

1.静态成员变量:

它具有以下几个特点:

        1.所有的对象共享同一份数据

        2.在编译阶段分配内存,在主函数之前进行构造

        3.类内声明,类外初始化

        4.可以通过类或者对象访问共有的静态成员变量

        5.可发生继承时,静态成员变量不会被继承,子类和父类共享同一个静态成员变量。

        6.静态成员变量不占用对象内存

        7.静态成员变量也是有访问权限的,私有的类外无法访问

下面,我们逐点进行分析:

首先,所以对象共享同一份数据,那么这个静态成员变量就不是独属于某一个对象,这也证明了第6点:静态成员变量不占用对象的内存。看这样一段代码:

#include<iostream>
using namespace std;
class A {
public:
	int a;
	static int b;
	A() {
		this->a = 5;
	}
};
int A::b = 9;//应该在类外进行初始化,在类内初始化会报错
int main() {
	cout <<"类A的大小是:"<< sizeof(A) << endl;
	A a1;
	A a2;
	a2.b = 6;
	cout << a1.b << endl;
	cout << a2.b << endl;
	return 0;
}

定义了一个类A,里面包括一个成员变量和一个静态成员变量。我们利用sizeof来计算这个类的大小,按道理说,计算的结果应该是8,

结果显示类A的大小是4,这就说明静态成员变量不占用对象的内存。同时,在主函数中定义了两个A的对象,他们都可以访问到静态成员变量b,通过对象a2去修改静态成员变量的值,最终输出来的结果是6,而不是初始化的值9,所以说是所有对象共享同一份数据。

对于静态成员变量的访问有两个形式,一种是通过对象访问,一种是通过类访问,如上图。

#include<iostream>
using namespace std;
class A {
public:
	int a;
	static int b;
	A() {
		this->a = 5;
	}
};
class B : public A {
public:
	int num;
};
int A::b = 9;//应该在类外进行初始化,在类内初始化会报错
int main() {
	A a1;
	B b1;
	cout<<a1.b<<endl;
	cout<<b1.b << endl;
	return 0;
}

我们定义了一个类B,让他继承自类A,然后在主函数中都定义了这两个类的对象,他们都可以访问到静态成员变量。

说明子类和父类也是共享的同一个静态成员变量。

同时,也可以设置静态成员变量的访问权限,如果设置成私有的话,那么在类外就无法进行访问,需要在静态成员函数中才能访问。

2.静态成员函数

        1.静态成员函数只能访问静态成员变量

        2.没有this指针,所以静态成员函数内部不可以使用成员变量和成员函数

我们知道在类中函数传参的时候会有一个隐含参数this指针,但是在上面我们用这个this指针被告诉报错了,这就说明在静态成员函数中是没有this指针的,那么它也就无法访问类中的非静态成员和非静态成员函数的(因为要通过this指针找到这个对象,才能访问它的成员变量)。

        所以静态成员函数只能访问静态成员变量。

#include<iostream>
using namespace std;
class A {
public:
	int num;
	static int t;
	static void fun() {
		//num = 9;//报错,没有this指针,
		t = 10;
		cout << t << endl;
	}
};
int A::t = 5;
int main() {
	A a;
	a.fun();
	A::fun();
	return 0;
}

静态成员函数的访问方式和静态成员变量的方式相同。

标签:变量,访问,静态,成员,C++,int,类中,函数
From: https://blog.csdn.net/gemluoye/article/details/143660483

相关文章

  • C++的基础学习5
    //四、变量的作用域与生命周期////1.作用域:那里起作用那里就是变量的作用域//局部变量的作用域:就是变量所在的局部范围。//全局变量的作用域:整个工程。////#define_CRT_SECURE_NO_WARNINGS1//#include<stdio.h>//intg=2021;//全局变量////intmain()//{// print......
  • C++ namespace介绍
    我们来看一下这一段代码:intrand=0;intmain(){ printf("%d",rand); return0;}运行结果如下:当我们添加一个头文件stdlib.h时,运行结果如下:我们可以发现,报错了。这里的问题出现在我们在全局定义了一个变量rand.并且导入了一个头文件stdlib.h在stdlib.h这个......
  • 尽管语言都是 C++,由于平台和编译器的不同,API 的实现和使用方式也有所不同,导致出现了很
    确实,尽管语言都是C++,由于平台和编译器的不同,API的实现和使用方式也有所不同,导致出现了很多“变种”。以下是一些常见的原因和应对方法:1.平台差异Windows使用WinAPI,它是Windows系统特有的一组API,许多Windows特定的操作(如窗口管理、文件操作、进程管理)都依赖于Wi......
  • 如何使用gtest编写C++单元测试代码
    目录一.为什么要编写单元测试代码二.gtest是什么三.下载四.使用方法4.1场景一4.2场景二4.3场景三五.其他一.为什么要编写单元测试代码相信很多人都不喜欢编写单元测试代码,但是单元测试对我们来说真的很重要,单元测试可以暴露出我们自己的代码的内部问题,从而保证我......
  • Windows系统安装部署C++基础开发环境
    目录前言安装MinGW-w64安装VSCode安装CMake完成前言这篇文章讨论一下Windows系统怎么安装部署C++基础开发环境,你或许在想这还不简单吗,安装vs不就可以了吗,很对,可以在官网下载vs集成开发环境然后进行安装,这也是非常推荐的一种方案,当然因为比较简单,这篇文章就不讲这个方......
  • C++函数返回多种数据类型
    返回复合数据的结构体定义一个结构体Result,它包含一个整数、一个数组(使用std::vector)和一个矩阵(使用std::vector<std::vector>)。然后实现一个函数来填充这些数据并返回。示例代码:#include<iostream>#include<vector>#include<string>structResult{intn......
  • 【C++】踏上C++的学习之旅(六):深入“类和对象“世界,掌握编程的黄金法则(一)
    文章目录前言1."面向过程"和"面向对象"的碰撞1.1面向过程1.2面向对象2."类"的引入3."类"的定义3.1......
  • 《 C++ 修炼全景指南:十九 》想懂数据库?深入 B 树的世界,揭示高效存储背后的逻辑
    摘要本文深入探讨了B树的原理、操作、性能优化及其实际应用。B树作为一种平衡多路树结构,因其高效的查找、插入和删除操作广泛应用于数据库与文件系统中。文章首先介绍了B树的定义与性质,并详细阐述了节点分裂、合并等核心操作的实现方法。接着,通过分析B树在数据库检......
  • 通过C++跨平台的预编译宏来区分不同的操作系统:Win32/Win64/Unix/Linux/MacOS
    因为C++具有跨平台的特性,所以有些需求一套代码就多端使用,比如我最近在学习的OpenGLES。但是,不同平台还是具有一定差异性,所以我们首先得判断出是什么平台?比如iOS系统和Android系统。那么如何判断呢?我们接着往下看!要检查C或C代码中主机的操作系统,我们需要检查编......
  • C++基础学习4练习
    //题目三:交换两个变量的值//定义两个整数变量,要求用户输入它们的值。//交换这两个变量的值,并输出交换后的结果。//#define_CRT_SECURE_NO_WARNINGS1//#include<stdio.h>//intmain()//{// inta=0;// intb=0;// intc=0;// intd=0;//// printf("请输入数......