当前位置: 首页 > news >正文

C++从入门到精通——static成员

static成员

  • 前言
  • 一、static成员
    • 概念
    • 例题
  • 二、 static成员的特性
    • 特性
    • 例题
      • 静态成员函数可以调用非静态成员函数吗
      • 非静态成员函数可以调用类的静态成员函数吗


前言


一、static成员

概念

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。

静态成员是指属于类而不属于类的任何对象的成员。静态成员在类的所有对象之间共享,并且可以在不创建对象的情况下被访问。静态成员包括静态变量和静态方法。

静态变量是类的所有对象之间共享的变量。它们在内存中只有一份拷贝,并且可以直接通过类名访问。静态变量在类的任何对象被创建之前就被初始化,它们的值在所有对象之间是一致的。

静态方法是属于类而不属于任何对象的方法。它们可以直接通过类名调用,而不需要创建类的对象。静态方法通常用于执行与类相关的操作,而不涉及特定对象的状态。

静态成员在类的定义中使用static关键字进行声明。例如,以下是一个使用静态变量和静态方法的示例:

class MyClass {
public:static int staticVar; // 静态变量声明static void staticMethod(); // 静态方法声明
};int MyClass::staticVar = 0; // 静态变量定义和初始化void MyClass::staticMethod() {// 静态方法的实现cout << "This is a static method." << endl;
}int main() {MyClass::staticVar = 10; // 静态变量的访问MyClass::staticMethod(); // 静态方法的调用return 0;
}

在上述示例中,静态变量staticVar和静态方法staticMethod属于类MyClass,可以直接通过类名进行访问和调用。

例题

实现一个类,计算程序中创建出了多少个类对象。

class A
{
public:A() { ++_scount; }A(const A& t) { ++_scount; }~A() { --_scount; }static int GetACount() { return _scount; }
private:static int _scount;
};int A::_scount = 0;void TestA()
{cout << A::GetACount() << endl;A a1, a2;A a3(a1);cout << A::GetACount() << endl;
}

以上代码定义了一个名为A的类,该类包含一个私有的静态成员变量_scount,一个默认构造函数,一个拷贝构造函数和一个析构函数。在main函数中,调用TestA函数。

TestA函数中,首先调用A::GetACount()函数获取当前A类的对象数量,然后创建了两个A类的对象a1a2,并将a1传递给a3的拷贝构造函数。再次调用A::GetACount()函数获取当前A类的对象数量。

_scount是一个静态成员变量,它在类定义外进行初始化,并在类定义中被声明为私有。该变量用于记录A类的对象数量。默认构造函数和拷贝构造函数都会在对象创建时将_scount自增1,析构函数会在对象销毁时将_scount自减1。

因此,输出结果将显示A类对象的数量。首先是0,因为还没有创建任何A类的对象。然后是3,因为在TestA函数中创建了两个对象(a1a2),并进行了一次拷贝构造(a3)。最后,在TestA函数结束后,对象被销毁,_scount减少到0。

二、 static成员的特性

特性

  1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
  2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
  3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
  4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  5. 静态成员也是类的成员,受publicprotectedprivate 访问限定符的限制

例题

静态成员函数可以调用非静态成员函数吗

静态成员函数可以调用非静态成员函数,但需要通过对象或者指针来调用。因为非静态成员函数是依赖于具体的对象或者实例的,而静态成员函数是独立于对象或者实例的,所以在静态成员函数中不能直接访问非静态成员变量和非静态成员函数。但可以通过将对象作为参数传递进来或者通过对象指针来调用非静态成员函数。

非静态成员函数可以调用类的静态成员函数吗

非静态成员函数可以调用类的静态成员函数。在非静态成员函数中,可以使用类名和作用域解析操作符(::)来调用静态成员函数。


http://www.lryc.cn/news/340727.html

相关文章:

  • 【K8S:初始化】:执行kubeadm显示:connection refused.
  • msvcp140_1.dll是什么?找不到msvcp140_1.dll丢失解决方法
  • 【Java探索之旅】掌握数组操作,轻松应对编程挑战
  • 深入理解同步与异步编程及协程管理在Python中的应用
  • Win10本地更新无法升级win11 的0x80080005解决方法
  • 互联网轻量级框架整合之MyBatis核心组件
  • springboot websocket 持续打印 pod 日志
  • C代码编译过程与进程内存分布
  • Windows 部署ChatGLM3大语言模型
  • JS相关八股之什么是事件循环
  • SpringCloud集成Skywalking链路追踪和日志收集
  • HTTP 域名和主机是一回事吗?有了主机和域名,如何建站?
  • 运营干货:四个技巧掌握爆款选题方法
  • 柯桥商务口语之怎么样说英语更加礼貌?十个礼貌用语get起来!
  • 嵌入式工程师如何摸鱼?
  • C++语言题库(一)—— 基本知识类
  • gemini1.5 API调用
  • C++从入门到精通——const与取地址重载
  • 手写spring IOC底层源码来模拟spring如何利用多级缓存解决循环依赖的问题
  • C++11 Thead线程和线程池
  • Windows版Apache 2.4.59解压直用(免安装-绿色-项目打包直接使用)
  • 刀具表面上的微结构
  • css3实现微信扫码登陆动画
  • vue3 导入excel数据
  • C# linq 根据多字段动态Group by
  • C语言学习/复习22----阶段测评编程题
  • LeetCode-1766. 互质树【树 深度优先搜索 广度优先搜索 数组 数学 数论】
  • “数据安全服务能力”评定资格认证!不容错过
  • 【MATLAB 分类算法教程】_3麻雀搜索算法优化支持向量机SVM分类 - 教程和对应MATLAB代码
  • 利用机器学习库做动态定价策略的例子