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语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结