C\C++static关键字的用法总结

 

原文:https://blog.csdn.net/magic_world_wow/article/details/81351049 static关键字主要起隐藏作用

static关键字在C\C++中都可以修饰内置类型变量、函数


static修饰内置类型变量为静态变量:
static修饰的内置类型变量分为静态全局变量和静态局部变量,静态变量内存分配在 .data段,生成的符号为local类型的符号,在链接阶段进行符号解析时不做处理。静态变量只初始化一次,未初始化的静态变量会默认初始化为0。静态全局变量只在本文件可见,外部文件无法访问。而静态局部变量只在定义的作用域内可见,但他们的生存周期都是整个程序运行时期。
 

#include<stdio.h>
static int data1 = 10;
static int data2;
int main()
{
    static int data3 = 20;
    static int data4;
    int i = 3;
    while(i)
    {
        static data5 = 30;
        printf("data5 = %d\n", data5);
        i--;
        data5++;
    }
    printf("data1 = %d\n", data1);
    printf("data2 = %d\n", data2);
    printf("data3 = %d\n", data3);
    printf("data4 = %d\n", data4);
    //printf("data5 = %d\n", data5);超出data5的作用域无法访问
    return 0;
}

这里写图片描述

结果分析:data5初始化为30 后就不在执行“static int data5 = 30”这条指令了,data1和data3分别初始化为10 、20,而data2和data4未初始化,默认初始化为0。data5在while循环外面无法访问,这是因为超出了data5的作用域,但这些静态变量的生存周期都为程序运行时期。


static修饰函数
static修饰的函数为静态函数,静态函数主要是起到函数的隐藏作用,static修饰的函数只允许在当前文件中使用,在其他文件中无法找到该函数的地址,比如在一个工程中创建两个.cpp(.c)文件,main1、main2,在main1中定义一个static int add()函数并对该函数进行实现,而在main2中使用add函数是就编译会报错误,这就是由于static修饰该函数只允许在main1文件中使用造成的。


在C++中有类的存在static可以修饰数据成员和成员方法


static修饰数据成员
static修饰的数据成员属于类的组成部分,static修饰的数据成员不在栈上分配内存而在.data段分配内存,static修饰的数据成员不能通过调用构造函数来进行初始化,因此static修饰的数据成员必须在类外进行初始化且只会初始化一次。
 

#include<iostream>
using namespace std;

class Myclass
{
public:
    Myclass(int a = 0) :data1(a)
    {
        cout << "Myclass(int)" << endl;
    }
    void Show()
    {
        cout << "Show()" << endl;
        cout << data1<< " " << data2 << endl;
    }
    ~Myclass()
    {
        cout << "~Myclass()" << endl;
    }
public:
    static int data3;
private:
    int data1;
    static int data2;
};

//如果不对data2、data3初始化,编译会报错误
//无法解析的外部符号 "public: static int Myclass::data1" (?data1@Myclass@@2HA)
//无法解析的外部符号 "private: static int Myclass::data2" (?data2@Myclass@@0HA)
int Myclass::data1 = 20;
int Myclass::data2 = 30;
//初始化方式为作用域+变量+初始值
int main()
{
    Myclass class1(10);
    class1.Show();
    cout << class1.data3 << endl;
    return 0;
}

这里写图片描述

 

static修饰成员方法
static修饰的成员方法为静态成员方法,静态成员方法可以在类内或类外定义,但必须在类内声明;static成员方法没有this指针,所以不能直接引用非static数据成员或调用类的非static成员方法,只能调用类的static成员数据和static成员方法;static成员不是任何对象的组成,不依赖对象的调用所以static成员方法不能被声明为const,因为const只限定该类的对象;static成员方法不能同时被声明为虚函数。
 

#include<iostream>
using namespace std;

class Myclass
{
public:
    Myclass(int a = 0) :data1(a)
    {
        cout << "-------Myclass(int)-------" << endl;
    }
    void Show()
    {
        cout << "-------Show()-------" << endl;
        cout << "data1=" << data1 << " " << "data2=" << data2 << endl;
    }
    void mul()
    {
        cout << "------mul()-------" << endl;
        data1 *= add(data1);
    }
    static int add(int a)
    {
        cout << "--------add(int)-------" << endl;
        data3 += a;
        data2 += a;
        //data1 += a;无法使用data1
        cout << "data2=" << data2 << " " << "data3=" << data3 << endl;
        return (data3 + data2) / 2;
    }
    static void show()
    {
        cout << "-------show()---------" << endl;
        //Show();无法调用Show()
        add(data3);
    }
    ~Myclass()
    {
        cout << "--------~Myclass()-------" << endl;
    }
public:
    static int data3;
private:
    int data1;
    static int data2;
};

int Myclass::data2 = 20;
int Myclass::data3 = 30;
int main()
{
    Myclass class1(10);
    class1.Show();
    cout << "data3=" << class1.data3 << endl;
    Myclass::show();
    Myclass::add(20);
    class1.mul();
    class1.Show();
    return 0;
}

 

这里写图片描述

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值