首页 > 编程语言 >c++中static的用法

c++中static的用法

时间:2023-06-10 09:11:50浏览次数:38  
标签:变量 静态 成员 c++ 用法 int static 函数

1、静态全局变量

全局变量的空间会在程序的生命周期内分配,在全局变量的前面加上static,变成静态全局变量。

#include <iostream>
#include <string.h>
using namespace std;

static int n = 5;

int main()
{
    n = 10;
    printf("%d\n", n);
    return 0;
}

静态全局变量在全局数据区分配内存,那它和全局变量有啥区别呢?
全局变量不但在本文件中可以被访问,在其他文件中同样可以访问。写代码时很容易在不同文件定义相同名字的全局变量,这就会引发冲突。
而静态全局变量只能在声明它的整个文件可见,限制了该变量的访问范围。
同样的,静态全局函数,在全局函数前加上static,表示只能在声明文件中被访问。

2、静态局部变量

局部变量也就是定义在函数内部的变量,函数局部变量存放在栈区,该变量的生命周期由所在 {} 决定,进入 {} 作用范围而分配内存空间,退出 {} 作用范围而释放内存空间。
在局部变量的前面加上static,变成静态局部变量,即使多次调用该函数,静态变量的空间也只分配一次。

#include <iostream>
#include <string.h>
using namespace std;

void fun()
{
    static int n = 5;
    printf("%d\n", n);
    n++;
}
int main()
{
    int i;
    for(i=0; i<5; i++)
    {
        fun();
    }
    return 0;
}

前一次调用的变量值通过下一次函数调用传递,可以存储之前的函数状态。

3、静态成员变量

我们知道,一个类可以定义多个对象,每个对象都会对类中的普通成员变量进行空间分配,这些变量只由它所在对象使用。
静态成员变量是该类的所有对象所共有的。对于普通成员变量,每个类对象都有自己的一份拷贝,而静态成员变量整个类就一份,静态成员变量只分配一次内存,类的所有对象都共享这个变量,不属于任何一个类,不需要对象就可以访问。
静态成员变量不属于特定的对象,不会占用对象的内存,必须在类的外面进行初始化。对象的内存中只包括普通成员变量,注意不包括任何成员函数。sizeof(类名) 不会计算静态成员变量和成员函数。
普通成员变量随这对象的产生而产生,静态成员变量随着类的产生而产生,所以静态成员变量不能由构造函数初始化,即使没有对象,也可以访问静态全局变量。

#include <iostream>
#include <string.h>
using namespace std;

class A 
{
    public:
        static int n; //声明静态成员变量
};
int A::n = 5; //定义并初始化静态成员变量
int main()
{
    printf("n:%d, sizeof(A):%d\n", A::n, sizeof(A));
    return 0;
}

4、静态成员函数
就像类中的静态成员变量一样,静态成员函数也不依赖于类的对象,不具体作用于某个对象。
普通成员函数参数自带一个this指针,this指针指向类的对象本身,因为普通成员函数总是属于类对象,当函数被调用时,系统会把当前对象的起始地址赋给 this 指针。
静态成员函数属于类本身,因此不具有this指针。它无法访问属于类对象的非静态成员变量和非静态成员函数,它只能访问其他静态成员变量和静态成员函数。
可以通过对象来调用,但还是建议使 类名::静态成员函数 调用静态成员函数。
静态成员函数和静态成员变量在类实例化之前就已经存在可以访问,而此时非静态成员还是不存在的,因此静态成员函数不能访问非静态成员变量。

#include <iostream>
#include <string.h>
using namespace std;

class A 
{
    private:
        static int n; //声明静态成员变量
    public:
        static void fun();
        int m;
};
int A::n = 5; //定义并初始化静态成员变量
//定义静态成员函数,不能加static
void A::fun()
{
    printf("n:%d\n", n);
    // printf("m:%d\n", m); //error
}
int main()
{
    A aa;
    aa.fun();
    A::fun(); 
    return 0;
}

 

标签:变量,静态,成员,c++,用法,int,static,函数
From: https://www.cnblogs.com/lyfily-p-7439305/p/17470752.html

相关文章

  • C++面试八股文:指针占用多少个字节?
    C++面试八股文:指针占用多少个字节?某日小二参加XXX科技公司的C++工程师开发岗位4面:面试官:memset、memcpy和strcpy的区别是什么?小二:memset用于将一块内存设置为特定的值,memcpy用于将一块内存从一个位置复制到另一个位置,strcpy用于将一个字符串从一个位置复制到另一个位......
  • 【基础算法】关于高精度计算的问题【很高位数数据的加减乘除(相关代码用C++实现)】
    前言当我们在利用计算机进行一些计算时,可能会遇到这类问题:有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度也算较高了,但因受到硬件的限制,往往达不到实际问题所要求的精度。这时我们就可以通过程序设计来解决这类问题,例如:<fontcolor=red>创建......
  • C++面试八股文:了解sizeof操作符吗?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第10面:面试官:了解sizeof操作符吗?二师兄:略微了解(不就是求大小的嘛。。)面试官:请讲以下如何使用sizeof?二师兄:sizeof主要是求变量或者类型的大小。直接使用sizeof(type)或sizeof(var)即可。面试官:嗯。sizeof(int*)、sizeof(int**)......
  • Python中enumerate对象的用法与特点
    Python的内置函数enumerate()函数用来枚举可迭代对象中的元素,返回可迭代的enumerate对象,其中每个元素都是包含索引和值的元组。#枚举字符串中的元素>>>list(enumerate('abcd'))[(0,'a'),(1,'b'),(2,'c'),(3,'d')]#枚举列表中的元素>>>list(enumerate([�......
  • 详解Python中的位运算符规则、原理与用法
    在Python中,位运算符包括位与(&)、位或(|)、位求反(~)、位异或(^)、左移位(<<)和右移位(>>)。1.运算方法与规则位运算符只能适用于整数,其总体运算规则为:首先把整数转换为二进制表示形式,按最低位对齐,短的高位补0,然后进行位运算,最后把得到的二进制转换为十进制数。位与运算符运算规则:0&0=0&1=1&0=......
  • [Week 20]每日一题(C++,图论,数学,搜索)
    目录T1[Daimayuan]Collision(C++,多源最短路)题目描述输入描述输出描述样例输入1样例输出1样例输入2样例输处2数据范围解题思路T2[Daimayuan]农田划分(C++,数学,BFS)题目描述题目输入题目输出样例输入1样例输出1样例输入2样例输出2数据范围解题思路T3[Daimayuan]三段式(C++,数组前缀......
  • Python中的具名元组类用法
    >>>fromcollectionsimportnamedtuple>>>Point=namedtuple('Point',['x','y','z'])#创建具名元组类>>>Point<class'__main__.Point'>>>>p=Point(3,4,5)#实例化对象......
  • Python版归并排序算法(附Python程序__name__属性用法演示视频)
    importrandomdefmergeSort(seq,reverse=False):#把原列表分成两部分mid=len(seq)//2left,right=seq[:mid],seq[mid:]#根据需要进行递归iflen(left)>1:left=mergeSort(left)iflen(right)>1:right=mergeS......
  • Python中else关键字的常见用法
    Python中的else常见用法有三:选择结构、循环结构和异常处理结构。(1)选择结构这应该是最常见的用法,与关键字if和elif组合来使用,用来说明条件不符合时应执行的代码块。(2)循环结构Python中的for循环和while循环都可以带else子句,如果循环是因为条件不再成立而自然结束时会执行else中的代码......
  • 详解Python生成器函数和生成器对象的原理和用法
    包含yield语句的函数可以用来创建生成器对象,这样的函数也称生成器函数。yield语句与return语句的作用相似,都是用来从函数中返回值。与return语句不同的是,return语句一旦执行会立刻结束函数的运行,而每次执行到yield语句并返回一个值之后会暂停后面代码的执行,下次通过生成器对象的__n......