【C++】 --- static关键字简析

简介: 【C++】 --- static关键字简析

1. static作用于c/c++共有特点:

- 修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。                         
      - 修饰局部变量时,表明该变量的值不会因为函数终止而丢失。              
      - 修饰函数时,表明该函数只在同一文件中调用。
      -  static修饰的全局变量/局部变量,未初始化的放在bss段,已经初始化的static变量放在data段

static在C++独有的特点有那些呢?下面具体看。

2. C++中static成员的特点:

- 类的静态成员变量在全局区分配内存,由本类实例化的所有对象共享
  - 对于普通成员变量,每个类对象都会有一个分自己的拷贝,静态成员变量只分配一次内存,该类实例化的所有对象都可以访问;
  - 因为静态成员变量不占用对象的内存,所以没有实例化类时,它就已经存在,可以直接操作静态成员变量;
  - static成员变量和普通static变量一样,译时在静态数据区分配内存,到程序结束时才释放。这就意味着,static 成员变量不随对象的创建而分配内存,也不随对象的销毁而释放内存。而普通成员变量在对象创建时分配内存,在对象销毁时释放内存。
- 类的静态成员的两种访问形式
  - <类对象名>.<静态数据成员名>
  - <类类型名>:: <静态数据成员名>,静态成员不需要通过对象也能访问
- 静态数据成员初始化与一般数据成员初始化不同。初始化时可以不加 static,但必须要有数据类型。被 private、protected、public 修饰的 static 成员变量都可以用这种方式初始化。静态数据成员初始化的格式为:<数据类型><类名>::<静态数据成员名>=<值> 
- sizeof运算符不会计算静态成员变量

3. 何时采用静态数据成员

静态成员这种机制的目的就是将某些紧密相关的全局函数和全局变量写到类里面,看上去像一个整体,易于理解和维护。

如果要在多个对象之间实现数据共享,不要用全局变量,那么就可以使用静态成员变量。

静态数据成员主要用在各个对象都有相同的某项属性的时候。

#include <iostream>
using namespace std;
class Student{
private:
   char *name;
   int age;
   float score;
   static int num;    //学生人数
   static float total;  //总分
public:
   Student(char *, int, float);
   void say();
   static float getAverage();  //静态成员函数,用来获得平均成绩
};
int Student::num = 0;
float Student::total = 0;
Student::Student(char *name, int age, float score)
{
   this->name = name;
   this->age = age;
   this->score = score;
   num++;
   total += score;
}
void Student::say()
{
   cout<<name<<"的年龄是 "<<age<<",成绩是 "<<score<<"(当前共"<<num<<"名学生)"<<endl;
}
float Student::getAverage()
{
   return total / num;
}
int main()
{
   (new Student("小明", 15, 90))->say();
   (new Student("李磊", 16, 80))->say();
   (new Student("张华", 16, 99))->say();
   (new Student("王康", 14, 60))->say();
   cout<<"平均成绩为 "<<Student::getAverage()<<endl;
   return 0;
}

4. 静态成员函数特点

- 静态成员之间可以相互访问,即静态成员函数仅可以访问静态成员变量,静态成员函数;
- 非静态成员函数可以任意访问静态成员函数和静态数据成员;
- 由于没有this指针的额外开销,静态成员函数与类的全局函数相比速度会稍快;

参看链接:

https://www.runoob.com/w3cnote/cpp-static-usage.html

https://zhuanlan.zhihu.com/p/37439983

相关文章
|
2月前
|
存储 编译器 C语言
详解C/C++中的static和extern
本文详解了C/C++中`static`和`extern`关键字的用法和区别,通过具体代码示例说明了在不同情境下如何正确使用这两个关键字,以及`extern "C"`在C++中用于兼容C语言库的特殊作用。
详解C/C++中的static和extern
|
1月前
|
存储 编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(一)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
7天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
33 5
|
1月前
|
C语言 C++
C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
57 10
|
1月前
|
存储 编译器 数据安全/隐私保护
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解2
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
31 3
|
1月前
|
编译器 C++
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解1
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
47 3
|
1月前
|
C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(二)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
1月前
|
编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(三)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
2月前
|
C++
C/C++静态链接pthread库的坑【-static -pthread】
C/C++静态链接pthread库的坑【-static -pthread】
|
4月前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)