C语言及C++中static的总结

    科技2024-03-26  90

    文章转自:C语言和c++中的static总结

    C语言中的static

    static修饰全局变量,改变了变量的链接属性,使得这个全局变量只能在本文件中访问。static修饰局部变量,使其生命周期变长,只在该作用域中使用,离开该作用域。该变量没有被销毁,还在内存中,即使再一次访问,还是上一次变量的值,直到程序运行结束才释放,被static修饰的局部变量放在静态区存储区static修饰函数,改变了函数的链接属性,只能在本文件中调用,不能被其他文件访问 注意:静态变量可以多次赋值,但是只能初始化一次 static int a = 10; a = 20; int c = b; //请问c为多少? 10;

    C++ 中的Static

    人们希望能有一个或者几个数据是一个类所有的对象共有,比如学生属性,除了包含自身信息,成绩等,还希望拥有班上学生平均成绩,这个平均成绩就是每个对象(学生)拥有的,不单单只属于某个学生的属性。可以把平均成绩设置为全局变量,但不安全,且破坏类的分装性,所以引入静态成员的概念。static可以修饰变量和函数改变了变量的生命周期。

    class stu { public: static void shown(); //静态成员函数 .... private:static int num; //静态成员变量 ... }; //静态成员变量必须在类外定义 int stu::num = 0; //静态成员函数可以在类外(或类内)定义 void stu:: shown() { .... } int main() { //调用静态成员函数的三种方式 stu s1; s1.shown(); //方式1 stu::shown() //方式2 //方式三,用对象指针或者对象引用,主要用于静态成员函数访问非静态成员,一般它不访问静态成员 return 0; }

    static修饰类成员变量

    static修饰成员变量:变量在类内声明,在类外定义,定义时,不需要加static关键字;

    class student { public: student(int n, char *nm, double s); //构造函数 ~student(); //析构函数 void shown_infom(); void shown_count_sum(); private: int num; char *name; double score; static int count; //静态成员变量 static double sum; }; //类外初始化静态成员变量 int student::count = 0; double student::sum = 0; //类外初始化析构函数 student::student(int n, char *nm, double s) { name = new char[strlen(nm) + 1]; num = n; strcpy(name,nm); score = s; count++; //静态成员变量不能在构造函数初始化列表中 sum += score; } //初始化构造函数 student::~student() { } void student::shown_infom() { cout << num << " " << name << " " << score << endl; } void student::shown_count_sum() { cout << count << " " << sum << endl; } int main() { student st1(20160505, "bcr", 89.3); st1.shown_infom(); st1.shown_count_sum(); student st2(20160506, "lzk", 79.4); st2.shown_infom(); st2.shown_count_sum(); system("pause"); return 0; }

    特性(针对static修饰成员变量) 1.静态成员(包括变量和成员函数)为所有类对象所共享,不属于某个对象,是类属性。 2.静态成员变量必须在类外初始化,初始化时不添加static关键字,不能再构造函数初始化表中。 3.sizeof(对象)大小不包括静态成员。

    特性(针对static修饰的成员函数)

    静态成员函数没有隐藏的this指针,一般不能访问任何非静态成员(非静态可以访问静态),但普通成员有this指针。当调用一个对象的成员函数时(非静态成员函数),系统会把该对象的起始地址赋给成员函数的this指针。当调用一个对象的成员函数时(非静态成员函数),系统会把该对象的起始地址赋给成员函数的this指针。但是静态成员函数不属于对象的成员函数,与任何对象无关,因此静态成员函数没有this指针,

    既然没有指向某一对象,就无法对一个对象里的非静态成员进行默认访问(即在引用数据成员时不指定对象名)

    可以不用通过对象调用: 对象.静态成员, 类型::静态成员函数名字

    因为没有this指针,所以不能用const修饰;

    Processed: 0.014, SQL: 8