C++中的static的作用

C++中的static的作用
C++中的关键字static,顾名思义表示静止,静态,下面是C++中static的一些常见应用

一,作用于函数内部的局部变量
局部作用域静态变量的特点:当一个函数返回后,下一次再调用时,该变量还会保持上一回的值,函数内部的静态变量只开辟一次空间,且不会因为多次调用产生副本,也不会因为函数返回而失效
例如:
如果我想实现fun()函数功能:在函数内部定义count计数器,打印出每次调用它的次数,你可能会这样写,如下

#include<iostream>
using namespace std;
void fun()
{

    int count = 0;//不加关键字static
    count++;
    cout << "count=" << count << endl;
}
int main()
{
    cout << "Calling the “fun()”for the first time! " << endl;
    fun();
    cout << "Calling the “fun()”for the second time! " << endl;
    fun();

    return 0;
}

我们预计结果为:
第一次调用,打印出结果 1
第二次调用,打印出结果 2
我们试着运行后,结果并不是我们想要的,如下图:


两次运行结果都是1,这是为什么呢,原来是每次调用函数结束后,count值会失效,当再次调用函数时,count值会重新生成,初始值为1,这就达不到我们想要的结果,那该怎么办呢?这时候就需要static关键字作用的静态变量,如下:

#include<iostream>
using namespace std;
void fun()
{
    static int count = 0;//static 作用的静态变量
    count++;
    cout << "count=" << count << endl;
}
int main()
{
    cout << "calling the “fun()”for the first time! " << endl;
    fun();
    cout << "calling the “fun()”for the second time! " << endl;
    fun();
    return 0;
}

运行结果跟我们想要的结果就一致啦

另外,普通局部变量如果未赋予初值,编译器会报错

报错如下:

当局部变量加上static 后,定义时未赋予初值时,会默认初始化0

二,作用于类的成员,解决同一个类的不同对象之间数据和函数共享问题
1,作用于类的数据成员,使其成为静态数据成员
静态成员在每一个类中只有一个副本,由该类所有对象共同维护和使用,从而实现同一个类的不同对象数据共享。需要注意的是,如下

访问静态数据成员方式:类名::标识符
对静态数据成员初始化:在类定义外进行

之所以进行类名::标识符进行访问,是因为静态数据成语哪不属于任何一个对象,而在类外进行定义是因为需要以这种方式专门为他们分配空间。
举例说明:
直接在类内定义静态数据成员,编译器会报错


错误如下:


正确做法:


下面通过一段代码,理解一下对于“同一个类的不同对象数据共享”的理解,代码如下:

#include <iostream>
using namespace std;

class Point {   //Point类定义
public: //外部接口
    Point(int x = 0, int y = 0) : x(x), y(y) { //构造函数
        //在构造函数中对count累加,所有对象共同维护同一个count
        count++;
    }
    Point(Point &p) {   //拷贝构造函数
        x = p.x;
        y = p.y;
        count++;
    }
    Point() { count--; }
    int getX() { return x; }
    int getY() { return y; }

    void showCount() {      //输出静态数据成员
        cout << "  Object count = " << count << endl;
    }
private:    //私有数据成员
    int x, y;
    static int count;   //静态数据成员声明,用于记录点的个数
};

int Point::count = 0;   //静态数据成员定义和初始化,使用类名限定

int main() {    //主函数
    Point a(4, 5);  //定义对象a,其构造函数回使count增1
    cout << "Point A: " << a.getX() << ", " << a.getY();
    a.showCount();  //输出对象个数

    Point b(a); //定义对象b,其构造函数回使count增1
    cout << "Point B: " << b.getX() << ", " << b.getY();
    b.showCount();  //输出对象个数

    cout << "Point A: " << a.getX() << ", " << a.getY();
    a.showCount();  //输出对象个数

    return 0;
}

输出结果:


这里的Point类里面的A,B对象共有的属性object count 都是2 。该运行结果清晰的显示了同一个类的不同对象数据共享的理解。

2,作用于类的函数成员,使其成为静态函数成员
静态成员函数就是使用static关键字声明的函数成员,同静态数据成员一样,静态成员函数也属于整个类,由该类所有对象共同拥有,为所有对象共享

(1)静态成员函数主要用于处理该类的静态数据成员,可以直接调用静态数据成员。如果访问非静态成员,要通过对象来访问。例子如下:

class A {
public:
    static void f(A a);
private:
    int x;
    static int y;
};
void A::f(A a)
{
    cout << x;//对x的引用是错误的
    cout << a.x;//正确
    cout << y;//对x的引用是正确的的,引用静态数据成员
}

上面代码中报错如下:


所以,静态成员函数访问非静态成员,一定要通过对象来访问

(2)如果想在类外调用静态成员函数呢?------类外代码一般使用类名和作用域操作符来调用静态成员函数。

访问方式:一般通过类名::函数名调用,也可用类.函数名调用
举例说明,如下:


三,总结:
当static作用于非类内函数的局部变量时,每次函数调用不会随着函数返回而失效,当static作用于类内成员时,由该类所有对象共同维护和使用,从而实现同一个类的不同对象数据共享。

原文地址:https://www.cnblogs.com/-believe-me/p/11603860.html

时间: 2024-10-27 11:09:31

C++中的static的作用的相关文章

5.JAVA基础复习——JAVA中的static关键字作用与用法

static关键字: 特点: 1.static是一个修饰符,用于修饰成员.(成员变量,成员函数)static修饰的成员变量 称之为静态变量或类变量. 2.static修饰的成员被所有的对象共享. 3.static优先于对象存在,因为static的成员随着类的加载就已经存在. 4.static修饰的成员多了一种调用方式,可以直接被类名所调用,(类名.静态成员). 5.static修饰的数据是共享数据,对象中的存储的是特有的数据. 1 private static int age;//用static

C++ 中 const 和 static 的作用

目录 const 的主要应用如下: const 关键字使用的注意点: C++中static关键字有三个明显的作用: const的主要应用如下: const 用于定义常量:const定义的常量编译器可以对其进行数据静态类型的安全检查. const 修饰函数形式参数:当输入参数为用户自定义类型和抽象数据类型的时候,将"值传递"改为"const 引用传递" 可以提高效率. const 修饰函数的返回值:如果给"指针传递"的函数返回值加const,则返回

C/C++中static关键字作用总结

1.先来介绍它的第一条也是最重要的一条:隐藏.(static函数,static变量均可) 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.举例来说明.同时编译两个源文件,一个是a.c,另一个是main.c. 1 //a.c 2 char a = 'A'; // global variable 3 void msg() 4 { 5 printf("Hello\n"); 6 } //main.c int main() { extern char a; //

C/C++中static关键字作用总结[转]

1.先来介绍它的第一条也是最重要的一条:隐藏.(static函数,static变量均可) 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.举例来说明.同时编译两个源文件,一个是a.c,另一个是main.c. //a.c char a = 'A'; // global variable void msg() { printf("Hello\n"); } //main.c int main() { extern char a; // extern varia

C++中static关键字作用总结

1.先来介绍它的第一条也是最重要的一条:隐藏.(static函数,static变量均可) 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.举例来说明.同时编译两个源文件,一个是a.c,另一个是main.c. //a.c char a = 'A'; // global variable void msg() { printf("Hello\n"); } //main.c int main() { extern char a; // extern varia

C语言中数据的两种属性及static的作用

C语言中数据有两种属性:数据类型和存储类别.数据类型定义了数据格式(长度),存储类别定义了数据的作用域和生命期. 1.变量的声明 1.1 变量的声明的一般形式:存储类别 数据类型 变量名;数据类型以int为例: 自动变量:auto int i;//自动变量是局部变量 局部变量:在函数内部定义的变量,局部变量缺省存储类别时就是自动变量 作用域:从定义开始到函数结束. 生命期:从函数调用开始到函数推出为止. 外部变量/全局变量:在函数外部定义而没有指出存储类别的变量 定义外部变量:extern in

001.java中static的作用

static的作用: 1.将对象层级提升为类层级 (即将对象可以调用的,提升为对象和类均可调用的成员):   //推荐使用类来调用   ClassNme.静态成员 (包括变量.方法.成员对象) 2.static修饰的成员,在类加载时即准备完成,而不需要创建对象:   //类加载只做一次:1  类名. 的时候会类加载; 2  new 对象时会类加载 3.静态成员方法只能访问静态成员,不能访问非静态成员(因为调用该方法时可能还没有创建对象):    而非静态成员方法既能访问非静态成员,又能访问静态成

Java中static变量作用和用法详解

static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们.因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象. 用public修饰的static成员变量和成员方法本质是

(转)Java中的static关键字解析

转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: "static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法.这实际上正是static方法的主要用途." 这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键