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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)