C++中的static(静态)

这篇具有很好参考价值的文章主要介绍了C++中的static(静态)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2014年1月19日   内容整理自The Cherno:C++系列

2014年1月20日   内容整理自《程序设计教程:用C++语言编程 第三版》 陈家骏  郑滔

---------------------------------------------------------------------------------------------------------------------------------

static关键字在C++中有2个意思,这取决于上下文

  • 1.在类或者结构体的外部使用static关键字
  • 2.在类或者结构体内部使用static关键字

简而言之:

1.类或结构体外部的static,意味着你声明为static的符号将只能对你定义它的翻译单元可见

2.而类或结构体内部的静态变量static,意味着这个变量将于所有类的实例共享内存,这意味着该静态变量在你在类中创建的所有实例中。有时,同一个类的不同对象需要共享数据,如果使用全局变量来表示共享的数据,则缺乏对数据的保护。

---------------------------------------------------------------------------------------------------------------------------------

1.在类或者结构体的外部使用static关键字

现在我们集中研究在类或结构体外部的static变量

C++中的static(静态),C++自学,c++,笔记

//在具有如下两个文件main.cpp和Static.cpp的情况下运行代码,没有报错

C++中的static(静态),C++自学,c++,笔记

然而,让我们在Static.cpp中删除关键字static,再次运行报错,原因是多重定义了全局变量s_VariableC++中的static(静态),C++自学,c++,笔记

so,我们不可以在同一个项目中有两个同名的全局变量-

尝试1:extern关键字

C++中的static(静态),C++自学,c++,笔记

尝试2:static关键字

在某个.cpp文件中将变量声明为static,可以类比于在类中声明一个private的变量,其他的所有翻译单元都不能看到这个s_variable变量,the linker will not see this in a global scope C++中的static(静态),C++自学,c++,笔记

尝试在Static.cpp中定义一个函数试试 ,仍显示重复定义C++中的static(静态),C++自学,c++,笔记

尝试将Static.cpp中的function(){}函数标记为static的,点击运行,就不会报错了

C++中的static(静态),C++自学,c++,笔记

如果你想在头文件中声明一个静态变量,并将该头文件包含在两个不同的C++文件中,这就相当于在两个文件中都声明了相同的静态变量 

---------------------------------------------------------------------------------------------------------------------------------

2.在类或者结构体的内部使用static关键字

  在C++中,采用类的静态成员(static member)来解决同一个类的对象共享数据的问题,与普通数据成员不同的是,类定义中的静态数据成员对于该类的所有对象只存在一个拷贝,当通过一个对象改变了静态数据成员的值时,通过同类的其他对象可以看到这个修改。

类的静态成员分为:

  • 类的静态数据成员(static data)
  • 类的静态成员函数(static function)

类定义内部声明静态数据成员,而静态的数据成员往往需要在类的外部定义并初始化:

C++中的static(静态),C++自学,c++,笔记

 访问类的静态成员的方式有两种:
  • 通过对象访问,格式如上述object.Sum()
  • 通过类名访问,格式如上述A::Share

  如果你把static和变量一起使用,这意味着在类的所有实例中,这个变量都只有一个实例

如果我创建一个名为Entity的类,我不断创建Entity的实例,我仍然只会得到那个变量的一个版本

意思是如果某个实例改变了这个静态变量----在这个类中的所有实例都会反映这个变化。

so,通过类的实例来引用静态变量是没有意义的。

示例1:

C++中的static(静态),C++自学,c++,笔记

在上述代码中将x,y变成静态的 ,main函数中的初始化就会失败,因为x和y不再是类成员C++中的static(静态),C++自学,c++,笔记

解决方案:定义x和y

 C++中的static(静态),C++自学,c++,笔记

//这里有点乱了,下次回来改 

书上例题

---------------------------------------------------------------------------------------------------------------------------------

#include<iostream>
//P233例题
/*实现对某类的对象的计数:
 * 我们有时需要在程序执行的某个时刻知道创建了多少个某类对象(还未消亡)
 * 为了实现这个功能,我们可以在类中定义一个静态数据成员,每创建一个类的对象,就在构造函数中把该静态数据成员的值加1
 * 每撤销一个该类的对象就在析构函数中把该静态数据成员的值减1
 * 在程序运行的任何时刻,通过该静态数据成员,我们就可以知道某时刻该类的对象的个数
 */
//note:struct和class的书写格式都是直接花括号
class A{
    static int Obj_count;
public:
    A(){Obj_count++;}//构造函数、(这里我还没有学到)
    A(const A& a){Obj_count++;}

    ~A(){Obj_count--;}//析构函数

    //类中还定义了一个静态成员函数,用于获得创建的A类对象数目
    static int Get_Num_Of_Objects(){
        return Obj_count;
    }
};//class A

int A::Obj_count=0;//static变量被初始化为0

int main(){

    A arr[10];//每一个数组元素都是一个A 类
    for(int i=0;i<10;i++){

        A arr[i];

    }
    std::cout<<"It's 4:34 ,2024/1/20,the number of class A's objects is:"<<A::Get_Num_Of_Objects()<<std::endl;

    A object;
    std::cout<<"It's 4:34 ,2024/1/20,the number of class A's objects is:"<<A::Get_Num_Of_Objects()<<std::endl;

     }

---------------------------------------------------------------------------------------------------------------------------------

运行结果:

C++中的static(静态),C++自学,c++,笔记文章来源地址https://www.toymoban.com/news/detail-814031.html

到了这里,关于C++中的static(静态)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 中的 static:静态变量、静态方法,一切都在掌握中

    🎏:你只管努力,剩下的交给时间 🏠 :小破站 static ,这个小小的在Java中扮演着重要的角色,但它的用途和工作原理可能会让人感到困惑。你是否曾想过为什么有些方法和变量可以直接从类访问,而无需创建实例?或者为什么某些变量在多个实例之间共享相同的值?

    2024年02月04日
    浏览(43)
  • c++中static静态成员变量和静态成员函数、explcit和隐式类型转换、友元函数()详解

    声明为 static 的类成员 称为 类的静态成员 ,用 static 修饰的 成员变量 ,称之为 静态成员变量 ;用 static 修饰 的 成员函数 ,称之为 静态成员函数 。 静态成员变量一定要在类外进行初始化   静态成员 为 所有类对象所共享 ,不属于某个具体的对象,存放在静态区   静态成

    2024年02月04日
    浏览(50)
  • C++ | 说说类中的static成员

    【概念】:声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为 静态成员变量 ;用static修饰的成员函数,称之为 静态成员函数 。静态成员变量一定要在类外进行初始化 💬 面试题:实现一个类,计算程序中创建出了多少个类对象 上面这个是曾经一家公

    2023年04月24日
    浏览(39)
  • C++ 类和对象(静态的static、友元、内部类、匿名对象、explicit)知识点+完整思维导图+实操图+深入细节通俗易懂建议收藏

            时间的步伐有三种:未来姗姗来迟,现在像箭一样飞逝,过往永远静立不动。本章是类和对象的一个收尾篇,相信通过这三篇类和对象的学习,应该你已经更加清楚了解了C++的类和对象。 话不多说安全带系好,发车啦 (建议电脑观看) 。 附:红色,部分为重点

    2024年02月06日
    浏览(51)
  • 【学习笔记】C++ 中 static 关键字的作用

    在 C/C++ 中, static 在不同的应用场景下,有不同的作用,这里总结一下,避免在使用时弄混。 我按照以下的逻辑来分类 static 的作用场景 static 作用在变量上 static 作用在全局变量上:限制全局变量在本文件上 static 作用在局部变量上:即使离开变量作用域,也保存变量

    2024年02月09日
    浏览(57)
  • c++自学笔记

    本笔记为从菜鸟教程边学边记录的笔记---》C++ 教程 | 菜鸟教程 封装(Encapsulation) :封装是将数据和方法组合在一起,对外部隐藏实现细节,只公开对外提供的接口。这样可以提高安全性、可靠性和灵活性。 继承(Inheritance) :继承是从已有类中派生出新类,新类具有已有

    2024年02月01日
    浏览(29)
  • 【C++】自学终极笔记

     🌈个人主页: Sarapines Programmer  🔥 系列专栏: 本期文章收录在《C++闯关笔记》,大家有兴趣可以浏览和关注,后面将会有更多精彩内容!  ⏰翰墨致赠:文墨扬长风,情随碧波舞。江山孕雄心滚滚,志立云霄梦遨游。笔翰激雷鸣,豪情犹似澎湃浪涛,扬帆挟梦翱翔云际。

    2024年02月05日
    浏览(43)
  • C++万字自学笔记

    [@TOC] C++的IDE有CLion、Visual Studio、DEV C++、eclipse等等,这里使用CLion进行学习。 0.1 第一个C++程序 编写一个C++程序总共分为4个步骤 创建项目 创建文件 编写代码 运行程序 C语言中省略int只写main()相当于函数的类型为int,相当于int main(),C++中不建议省略 C++中int main()等价于int main

    2024年02月13日
    浏览(30)
  • 静态内部类的访问方法(static/无static)

    笔记汇总: 《Java面向对象程序设计》学习笔记 用static修饰内部类,可以直接通过内部类类名访问静态内部类。 没有用static修饰内部类,则需要new一个外部类实例,再通过外部实例创建内部类。 外部类之外创建内部类对象_new通过外部类创建内部类对象_Dingwensheng1222的

    2024年02月14日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包