C++static用法解析(给你的一份总结归纳)

2024-06-21 17:38

本文主要是介绍C++static用法解析(给你的一份总结归纳),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Static在C++的用法

  • 一、面向设计过程设计中的static
    •   1.静态全局变量
    •   2.静态局部变量
    •   3.静态函数
  • 二、面向对象static关键字(类中的static)
    •   1.静态数据成员
    •   2.静态成员函数
  • 三、类模板遇上Static

  前言:该文章主要讲解C++的类中含有static的情况,小白发文,若有不足欢迎各位大佬斧正( •̀ ω •́ )✧

一、面向设计过程设计中的static

  1.静态全局变量

    此处省略介绍

  2.静态局部变量

    此处省略介绍

  3.静态函数

  好处:静态函数不能被其他文件所用。
     其他文件中可以定义相同名字的函数,不会发生冲突
  

二、面向对象static关键字(类中的static)

  1.静态数据成员

  ■无论这个类的对象被定义了多少个,该成员是该类的所有对象所共有的
  ■该成员定义时要在全局数据区分配空间,所以不能在类声明里面定义

class Person
{
private:static int sum;		//声明static静态数据成员int m_age, m_id;
public:static int fun(Person* p){...}
};int Person::sum = 0;	//该成员是private时,在类声明外定义

  ■该成员没有进入程序的全局名字空间,因此不存在与其它全局名字冲突的可能性
  ■可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能

  2.静态成员函数

  ■无论这个类的对象被定义了多少个,该成员是该类的所有对象所共有的
  ■类体外的函数定义不能指定关键字static
  ■调用函数,可用一个类的对象(.)或(->)指向类对象的指针调用静态成员函数。当用for_each时,要调用函数,用的是(.)调用的,若不给函数加上static,只能在类外部实现,但会导致个问题“不能用调用类private数据成员”。所以我们可以给函数加上static解决这问题

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
class Person
{
private:int m_age, m_id;
public:Person(){}Person(int age, int id) : m_age(age), m_id(id){}static void func(Person* p){cout << "age: " << p->m_age << "id: " << p->m_id << endl;}
};/** 会报错  **/
//	void func(Person* p)
//	{
//		cout << "age: " << p->m_age << "id: " << p->m_id << endl;
//	}int main()
{vector<Person*> v;Person p1(10, 20), p2(20, 30), p3(30, 40);v.push_back(&p1);v.push_back(&p2);v.push_back(&p3);vector<Person*>::iterator pBegin = v.begin();vector<Person*>::iterator pEnd = v.end();for_each(pBegin, pEnd, Person::func);	//此处是用(.)调用函数的return 0;
}

  

三、类模板遇上Static

  这种情况,我们会引出一个这样的问题 “static成员是被全部具体的实现类共享,还是每个具体的实现类都会创建属于自己的static成员?”
  我们以下面的代码进行举例:

#include <iostream>
#include <windows.h>
using namespace std;template<class T>
class Person
{
public:static int a;
};//类外初始化
template<class T> int Person<T>::a = 0;int main()
{SetConsoleTitle("IF template class include static mumber");/** 两个不同的具体实现类 **/Person<int> p1, p2, p3;Person<char>pp1, pp2, pp3;p1.a = 10;pp1.a = 100;cout << p1.a << "  " << p2.a << "  " << p3.a << endl;cout << pp1.a << "  " << pp2.a << "  " << pp3.a << endl;return 0;
}

  我们根据上面所说,思考这样一个问题 “p1\p2\p3 和 pp1\pp2\pp3的值是多少?如果是共享一个static,那么它们的值都一样是100,否则他们的值将不相等”
  
  根据如下类图,具体实现类1 和 具体实现类2,虽然都用了模板类的static int a,但是他们两个是相互独立、互不干扰的

template模板类 +staticint a 具体实现类1 +staticint a +实现方法() 具体实现类2 +staticint a +实现方法() 对象1 对象2 对象3 对象4 对象5 对象6

  
所以以上的代码Output:
p1=10  p2=10  p3=10
p1=100  p2=100  p3=100
  
路漫漫其修远兮,吾将上下而求索

这篇关于C++static用法解析(给你的一份总结归纳)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081889

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat