c++中的static

静态变量

        如果要在函数内部的局部作用域中声明具有静态生存期的对象,则要使用关键字static。

        如:static int i;

        局部作用域中静态变量不会随着函数调用而产生一个副本,也不会谁着函数返回而失效。定义静态变量时可以同时赋初值,对于基本类型静态生存期便来年给,会被赋予0值初始化。

        对象的生存期与程序的运行期相同,则称它具有静态生存期。命名空间作用域中声明的对象都是具有静态生存期的。

        除了命名空间作用域中声明的对象和类的数据成员可以用static修饰作为类的静态成员外,其余的对象都具有动态生存期,在局部作用域中声明的具有动态生存期的对象常常称之为局部生存期对象,它诞生于声明点,结束于声明所在的块执行完毕之时。


类的静态成员

       面向对象程序设计兼顾数据的共享和保护,封装数据和操作为类,类内部的函数之间实现数据共享,同时设置访问属性,使这种共享受限制。限制共享在类范围内。对类外数据成员来说是隐藏的,达到了共享和隐藏两全。

       对象与对象之间也要共享数据,静态成员可以解决同类的不同对象之间数据和函数共享的问题。

类的静态数据成员

       类某个属性为所有类共有,不属于任何具体对象,采用static关键字声明为静态成员。静态成员在每个类只有一个副本,由该类的所有对象共同维护和使用,实现同一类的不同对象之间的数据共享。静态数据成员具有静态生存期,采用  类名::标识符  进行访问。在类的定义中仅仅对静态数据成员进行引用性声明,必须在命名作用域的某个地方使用类名限定定义性声明,此时,可以初始化,单独为其分配内存空间。

       类内声明,类外定义和初始化。

类的静态成员函数成员

        静态函数成员使用static关键字修饰的函数成员。同静态数据成员一样,静态成员函数也属于整个类,由同意个类的所有对象共同拥有,为这些对象所共享。

静态成员函数可以通过类名或对象名来调用,而非静态成员函数只能通过对象名来调用。

        静态成员函数可以直接访问该;类的静态数据和函数成员。而访问该类的非静态数据和函数成员,必须通过对象名,这是因为在静态成员函数中访问类的非静态成员需要指明对象,是因为对静态成员函数的调用是没有目的对象的。因此不能像非静态成员函数那样,隐含地通过目的对象访问类的非静态成员。

        通过静态函数成员访问非静态成员相当麻烦。一般情况下,它主要用来访问同类中的静态数据成员,维护对象之间共享的数据。

将变量和函数限制在编译单元内

        在定义变量和函数时,使用static关键字,用static关键字来修饰命名空间作用域的变量或函数时,和extern关键字起相反作用。它会使得被static修饰的变量和函数无法被其他编译单元引用。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++,`static`是一个关键字,可以用于修饰变量、函数和类。它具有不同的含义,取决于它所修饰的内容。 1. 静态变量(Static Variables):在函数内部使用`static`修饰的变量称为静态变量。静态变量在程序的生命周期只被初始化一次,并且在函数调用之间保持其值。静态变量存储在静态存储区,而不是堆栈。可以通过函数名和作用域解析运算符来访问静态变量。 ```cpp void foo() { static int counter = 0; // 静态变量 counter++; cout << "Counter: " << counter << endl; } int main() { foo(); // 输出: Counter: 1 foo(); // 输出: Counter: 2 return 0; } ``` 2. 静态函数(Static Functions):在类使用`static`修饰的成员函数称为静态函数。静态函数不依赖于任何特定的对象,可以直接通过类名进行调用。它们不能访问非静态成员变量,只能访问其他静态成员(包括静态变量和静态函数)。 ```cpp class MyClass { public: static void staticFunc() { cout << "This is a static function" << endl; } }; int main() { MyClass::staticFunc(); // 输出: This is a static function return 0; } ``` 3. 静态数据成员(Static Data Members):在类使用`static`修饰的成员变量称为静态数据成员。静态数据成员属于类本身,而不是类的实例。它们在程序的生命周期只有一个副本,并且可以被类的所有对象共享。静态数据成员必须在类外部进行定义和初始化。 ```cpp class MyClass { public: static int staticVar; }; int MyClass::staticVar = 10; // 定义和初始化静态数据成员 int main() { cout << MyClass::staticVar << endl; // 输出: 10 return 0; } ``` 使用`static`关键字可以有效地控制变量、函数和类的作用范围和生命周期,并且具有一些特殊的用途,例如实现单例模式或在类共享数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值