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指针的额外开销,静态成员函数与类的全局函数相比速度会稍快;
参看链接: