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

相关文章

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交