【static】关键字静态成员:在类级别上共享数据和方法的机制

2023-12-05

static

static成员独立于类对象存在,也就是说它不属于对象的成员,它能被全体对象所共享。
统计·类类型对象创建的个数,用static成员来实现。
非static成员属于类对象,每个对象都有一份拷贝。
static成员函数没有this指针,他不能访问非static成员,也不能调用非static成员函数。

静态成员变量在定义性说明时不用再加static关键字。

#include<iostream>
using namespace std;
class CBOOK
{
    public:
        CBOOK(int price , int nums)
        {
            this->price = price;
            this->nums = nums;
        }
      int nums;
      int price;
      static int x ; //静态成员的引用性说明
};
 static int CBOOK::x =100; //静态成员的定义性说明,error,static关键字
int main()
{
cout<<CBOOK::x<<endl;
    return 0;
}

错误如下:

staticnumbers.cpp:28:19: error: ‘static’ may not be used when defining (as opposed to declaring) a static data member [-fpermissive]
 static int CBOOK::x =100;
                   ^            

静态成员变量不能多次初始化

#include<iostream>
using namespace std;
class CBOOK
{
    public:
        CBOOK(int price , int nums)
        {
            this->price = price;
            this->nums = nums;
        }
      int nums;
      int price;
      static int x = 102;
};
 int CBOOK::x =100;  //error,多次初始化
int main()
{
cout<<CBOOK::x<<endl;
    return 0;
}

错误如下:

[bsk@localhost classobject]$ g++ staticnumbers.cpp 
staticnumbers.cpp:25:22: error: ISO C++ forbids in-class initialization of non-const static member ‘CBOOK::x’
       static int x = 102;
                      ^
staticnumbers.cpp:27:13: error: duplicate initialization of ‘CBOOK::x’
  int CBOOK::x =100;
             ^
staticnumbers.cpp:27:16: error: ISO C++ forbids in-class initialization of non-const static member ‘CBOOK::x’
  int CBOOK::x =100;

可以使用类初始化的对象来调用静态成员,但是一般不会这样做,因为会容易理解错误,静态成员是属于整体的而不是类对象。

#include<iostream>
using namespace std;
class CBOOK
{
    public:
    CBOOK(){}//重载一下空实现,因为当构造函数有参函数出现后,会自动覆盖编译器提供的空实现,从而再想去调用空实现,就会报错。
        CBOOK(int price , int nums)
        {
            this->price = price;
            this->nums = nums;
        }
      int nums;
      int price;
      static int x = 102;
};
 int CBOOK::x =100;  //error,多次初始化
int main()
{
CBOOK c;
cout<<CBOOK::x<<endl;
    cout<<c.x<<endl;
    return 0;
}

静态成员函数

#include<iostream>
using namespace std;
class CBOOK
{
    public:
    CBOOK(){}//重载一下空实现,因为当构造函数有参函数出现后,会自动覆盖编译器提供的空实现,从而再想去调用空实现,就会报错。
        CBOOK(int price , int nums)
        {
            this->price = price;
            this->nums = nums;
        }

           void function() //普通·成员函数
        {
            cout<<"funcyion"<<endl;
            cbookfunction();
        }
        static void  cbookfunction() //静态成员函数
        {
            cout<<"static cbookfuncyion"<<endl;
        }

      int nums;
      int price;
      static int x;
};
 int CBOOK::x =100;  //error,多次初始化
int main()
{
CBOOK c;
    cout<<CBOOK::x<<endl;
    cout<<c.x<<endl;
    c.function();
    return 0;
}

在普通·成员函数中可以调用静态成员函数,但是在静态成员函数中不可以·调用普通成员函数,

会出现下面的错误·:

[bsk@localhost classobject]$ g++ staticnumbers.cpp 
staticnumbers.cpp: In static member function ‘static void CBOOK::cbookfunction()’:
staticnumbers.cpp:31:22: error: cannot call member function ‘void CBOOK::function()’ without object
             function();

静态成员变量在静态成员函数或者非静态成员函数都可以访问

#include<iostream>
using namespace std;
class CBOOK
{
    public:
        CBOOK(){}
        CBOOK(int price , int nums)
        {
            this->price = price;
            this->nums = nums;
        }

   
        void function()
        {
            cout<<"funcyion"<<endl;
            cbookfunction();
    		cout<<x<<endl;
 
        }
        static void  cbookfunction()
        {
  //          function();
            cout<<"static cbookfuncyion"<<endl;
            cout<< x<<endl;
            
        }
      int nums;
      int price;
      static int x ;
};
 int CBOOK::x =100;
//int Cbook::price = 410;
int main()
{
   CBOOK book(12,123);

    CBOOK c;
book.function();    
return 0;
}

在静态成员函数中不可以访问·非静态成员变量·

#include<iostream>
using namespace std;
class CBOOK
{
    public:
        CBOOK(){}
        CBOOK(int price , int nums)
        {
            this->price = price;
            this->nums = nums;
        }

   
        void function()
        {
            cout<<"funcyion"<<endl;
            cbookfunction();
    		cout<<x<<endl;
 			cout<<nums<<endl;
        }
        static void  cbookfunction()
        {
  //          function();
            cout<<"static cbookfuncyion"<<endl;
            cout<< x<<endl;
            cout<<nums<<endl;//error 不可访问
        }
      int nums;
      int price;
      static int x ;
};
 int CBOOK::x =100;
//int Cbook::price = 410;
int main()
{
   CBOOK book(12,123);

    CBOOK c;
book.function();    
return 0;
}

static用法总结

01.用于函数内部修饰变量,即函数内的静态变最。这种变量的生存期长于该函数,使得函数具有一定的“状态”。使用静态变量的函数一般是不可重入的,也不是线程安全的,比如strtok(3).
02.用在文件级别(函数体之外),修饰变量或函数,表示该变量或函数只在本文件可见,其他文件看不到也访问不到该变量或函数。专业的说法叫“具有internal inkage”(简言之:不暴露给别的translation unit)
03.C语言的这两种用法很明确,一般也不容易混淆

类的大小

  1. 类的大小遵循结构体对齐原则
  2. 类的大小与数据成员有关,与成员函数无关
  3. 类的大小与静态成员函数无关
  4. 虚函数对类的大小有影响(多虚表指针)
  5. 虚继承对类的大小有影响

四种作用域

栈对象

隐含用构造函数(程序中没有显示调用)

堆对象

隐含调用构造函数(程序中没有显示调用)

全局对象、静态全局对象

全局对象的构造 先于main函数
已初始化的全局变量或静态全局对象存储于.data段中。
未初始化的全局变量或静态全局对象存储于:bss段中

静态局部对象

已初始化的静态局部变量存储于.data段中,
未初始化的静态局部变量存储于.bss段中

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【static】关键字静态成员:在类级别上共享数据和方法的机制 的相关文章

  • 在C语言中使用“void”

    我很困惑为什么我们需要通过void转换为 C 函数 int f void return 0 versus int f return 0 什么是正确的做法以及为什么 In C int f 是一种老式的声明 它说f需要固定但未指定数量和类型的参
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 从 MVC 迁移到 ASP.NET Core 3.1 中的端点路由时,具有角色的 AuthorizeAttribute 不起作用

    我正在尝试将我的项目从 UseMVC asp net core 2 2 兼容样式 升级到 UseEndpoint Routing 并且我的所有请求都被重定向到我的验证失败页面 它与声明有关 如果我删除 Authorize Roles Adm
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 在 C 中使用 GNU automake 中的解析器

    我是 GNU autotools 的新手 在我的项目中使用了 lex 和 yacc 解析器 将它们作为 makefile am 中的源代码会产生以下错误 配置 in AC CHECK PROGS YACC bison yacc none i
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 双精度类型二维多维数组的 pinvoke 编组作为 c# 和 c++ 之间的输入和输出

    我有以下我正在尝试解决的双物质类型的 2d 多维数组的 c 和 c pinvoke 编组 我已经查看了以下热门内容以获得我目前拥有的内容使用双精度数组进行 P Invoke 在 C 和 C 之间编组数据 https stackoverflo
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项

随机推荐