c++ static

https://www.cnblogs.com/dhls231/p/static.html

 

static

在了解static之前先清楚内存中的分布情况:

 

 

静态区(全局区):静态变量和全局变量的存储区域是一起的,一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放。

 

面向对象的static

Static是C++中一个常见的关键字,它被用来控制变量的存储方式和可见性。

  1. 类中的静态变量 声明为static的变量只被初始化一次,因为它们在单独的静态存储中分配了空间,因此类中的静态变量由对象共享,可以减小对象的大小。对于不同的对象,不能有相同静态变量的多个副本。也是因为这个原因,静态变量不能使用构造函数初始化。

注意:类中的静态成员变量必须在类内声明,在类外定义(被const修饰的除外).

class Apple 
{ 
public: 
    static int i;  // 类内声明

    Apple() 
    { 
        // Do nothing 
    }; 
}; 

int Apple::i = 1;  // 类内定义
class Apple 
{ 
public: 
      // 被const修饰的static变量在c++11中可以在类内被直接初始化。
    static const int i=10; 
    Apple() 
    { 
        // Do nothing 
    }; 
};
    

  类中的静态变量注意点:

  • 静态数据成员属于类,而不像普通的数据成员那样属于某个对象,因此我们可以用“类名::”这样的形式访问静态数据成员。如:Student::count。
  • 静态数据成员不能在类中进行初始化,因为类中不给他分配内存空间(前面说的类中存储地址是堆栈,静态数据成员存储地址是静态存储空间),所以必须在其他地方为他提供定义和初始化。默认时,静态成员被初始化为0。
  • 静态数据成员和静态变量一样,是在编译时创建并进行初始化的。它在该类的任何对象创建之前就已经存在。因此,公有的静态数据成员可以在对象定义之前就被访问。对象定以后,公有的静态数据成员也可以通过对象进行访问,格式如下:

    对象名.静态数据成员名;

    对象名->静态数据成员名;
  • 静态数据成员也遵循public,protect,private的原则。所以,私有的静态数据成员不能被类外部函数访问,也不能用对象进行访问。
  • 静态数据成员的类型可以是该成员所属的类类型。非静态数据成员被限定为申明其自身类的对象的指针或引用。
  • 静态数据成员可以用作默认实参,而普通数据成员不可以。
  • C++支持静态数据成员的一个主要原因是可以不必使用全局变量。依赖于全局变量的类很容易违反面向对象程序的封装原理。静态数据成员的主要用途是定义类的各个对象所公用的数据,如:统计数据、平均数等。
  1. 类中的静态成员函数 :静态成员函数也不依赖于类的对象。我们被允许使用对象和'.'来调用静态成员函数。但建议使用类名和范围解析运算符调用静态成员。静态成员函数仅能访问静态数据成员或其他静态成员函数,它们无法访问类的非静态数据成员或成员函数。

  静态成员函数说明:

  • 静态成员函数可以定义成内嵌的,也可以在内外定义,在类外定义是,前面不需要加static。
  • 一般情况下,静态成员函数主要是用来访问全局变量或者同一个类中的静态数据成员。
  • 私有静态成员函数不能被类的外部函数和对象访问。
  • 使用静态成员函数的一个原因就是可以用它在建立任何对象之前处理静态数据成员这是普通成员函数不能实现的。
  • 编译系统将静态成员函数限定为内部连接,也就是说,与现行的文件相连接的文件中的同名函数不会与该函数发生冲突,维护了该函数的安全性,这是使用静态成员函数的另外一个原因。
  • 在一般的成员函数中都隐藏一个this指针,用来指向对象自身,而在静态成员函数中没有这个this指针,因为它不与特定的对象相关联。调用静态成员函数使用如下格式:类名::静态成员函数名();
  • 静态成员函数不能被申明为const,因为static成员不是任何对象的组成部分,毕竟,将成员函数申明为const就是承诺不会修改该函数所属的对象。
  • 静态成员函数不能被申明为虚函数。
  • 一般而言,静态成员函数不可访问类中的非静态成员。如果确实需要,静态成员函数只能通过对象名(或指向对象名的指针)访问该对象的非静态成员。
  1. 静态类 :和变量一样,静态类的生命周期直到程序的结束。在main结束后才会调用静态类的析构函数。

 

 延伸:

静态局部变量

静态局部变量属于静态存储方式,它具有以下特点:

(1)静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。

(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

(3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型变量赋空字符。

(4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点,可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

posted @   我有时候也想努力  阅读(234)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示