static关键字用法

static修饰局部变量

  • 静态局部变量存储在全局静态区
  • 生存期为整个程序生命周期,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。
  • 静态局部变量若在声明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。

static修饰全局变量

  • 非静态全局变量的作用域是整个源程序,也即在各个源文件中都是有效的。
  • 而静态全局变量则只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它 

 

二、C++ 中的static关键字(类中的static关键字)

1、static 数据成员

在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。

#include <iostream>  
using namespace std;class Myclass {
public:Myclass(int a, int b, int c);void GetSum();private:int a, b, c;static int Sum; //声明静态数据成员  
};int Myclass::Sum = 0; //定义并初始化静态数据成员  
//static int Myclass::Sum = 0; //注意加static, 是错误的  Myclass::Myclass(int a, int b, int c)
{this->a = a;this->b = b;this->c = c;Sum += a + b + c;
}void Myclass::GetSum()
{cout << "Sum = " << Sum << endl;
}int main()
{Myclass M(1, 2, 3);M.GetSum(); // cout 6  Myclass N(4, 5, 6);N.GetSum(); // cout 21  M.GetSum(); // cout 21  
}

输出结果:

 可以看出,static数据成员有以下特点:

(1). 对于非static数据成员,每个类对象都有自己的拷贝。而static数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问

(2). 静态数据成员存储在全局数据区。静态数据成员定义时才分配空间,所以不能在类声明中定义。
在上例中,语句 int Myclass::Sum = 0; 是定义静态数据成员;

(3). 静态数据成员和普通数据成员一样遵从public, protected, private 访问规则;除了定义,定义不要管访问规则。

(4). 因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它

(5). 静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:

//<数据类型><类名>::<静态数据成员名>=<值>  
int Myclass::Sum=0;  

(6). 类的静态数据成员有两种访问形式:

//<类对象名>.<静态数据成员名>  
M.Sum = 0  //<类类型名>::<静态数据成员名>  
Myclass::Sum = 0  

(7). 静态数据成员主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类,每个实例的利息都是相同的。所以,应该把利息设为存款类的静态数据成员。这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,所以节省存储空间。第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了;

 

2、static 成员函数
  static 成员函数,它为类的全部对象服务而不是为某一个类的具体对象服务。普通的成员函数一般都隐含了一个this指针,但静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义上讲,它无法访问属于类对象的no-static数据成员,也无法访问no-static成员函数,它只能调用其余的静态成员函数。

#include <iostream>  
using namespace std;class Myclass {
public:Myclass(int a, int b, int c);static void GetSum(); // 声明静态成员函数
private:int a, b, c;static int Sum; //声明静态数据成员  
};int Myclass::Sum = 0;//定义并初始化静态数据成员  Myclass::Myclass(int a, int b, int c)
{this->a = a;this->b = b;this->c = c;Sum += a + b + c; //非静态成员函数可以访问静态数据成员  
}//static void Myclass::GetSum(){...} //加上static是错误的  
void Myclass::GetSum() //静态成员函数的实现  
{//cout<<a<<endl; //错误代码,a是非静态数据成员  cout << "Sum = " << Sum << endl; //静态函数是能访问静态数据成员  
}int main()
{Myclass M(1, 2, 3);M.GetSum();Myclass N(4, 5, 6);N.GetSum();Myclass::GetSum();
}

关于静态成员函数,可以总结为以下几点:

  • (1). 在类体外,静态函数的定义前不能加关键字static;
  • (2). static成员之间可以相互访问,包括static成员函数访问static数据成员和访问static成员函数;
  • (3). 非静态成员函数可以任意地访问静态成员函数和静态数据成员;
  • (4). 静态成员函数不能访问非静态成员函数和非静态数据成员,只能访问静态的;
  • (5). 由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长
  • (6). 调用静态成员函数,可以用成员访问操作符(.)和(->)或直接用类名调用静态成员函数

1

2

M.GetSum();  

Myclass::GetSum(); // 调用类的静态成员函数。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/385229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1029 旧键盘 (20 分)

旧键盘上坏了几个键&#xff0c;于是在敲一段文字的时候&#xff0c;对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字&#xff0c;请你列出肯定坏掉的那些键。 输入格式&#xff1a; 输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每段…

volatile、const的用法

1. volatile 访问寄存器要比访问内存要块&#xff0c;因此CPU会优先访问该数据在寄存器中的存储结果&#xff0c;但是内存中的数据可能已经发生了改变&#xff0c;而寄存器中还保留着原来的结果。为了避免这种情况的发生将该变量声明为volatile&#xff0c;告诉CPU每次都从内存…

1030 完美数列 (25 分)

给定一个正整数数列&#xff0c;和正整数 p&#xff0c;设这个数列中的最大值是 M&#xff0c;最小值是 m&#xff0c;如果 M≤mp&#xff0c;则称这个数列是完美数列。 现在给定参数 p 和一些正整数&#xff0c;请你从中选择尽可能多的数构成一个完美数列。 输入格式&#xff…

《STL源码剖析常见面试问题》

1. 当vector的内存用完了&#xff0c;它是如何动态扩展内存的&#xff1f;它是怎么释放内存的&#xff1f;用clear可以释放掉内存吗&#xff1f;是不是线程安全的&#xff1f; (1). vector内存用完了&#xff0c;会以当前size大小重新申请2*size的内存&#xff0c;然后把原来…

1034 有理数四则运算 (20 分)

本题要求编写程序&#xff0c;计算 2 个有理数的和、差、积、商。 输入格式&#xff1a; 输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数&#xff0c;其中分子和分母全是整型范围内的整数&#xff0c;负号只可能出现在分子前&#xff0c;分母不为 0。 输出格式&…

1035 插入与归并 (25 分)

根据维基百科的定义&#xff1a; 插入排序是迭代算法&#xff0c;逐一获得输入数据&#xff0c;逐步产生有序的输出序列。每步迭代中&#xff0c;算法从输入序列中取出一元素&#xff0c;将之插入有序序列中正确的位置。如此迭代直到全部元素有序。 归并排序进行如下迭代操作&a…

迭代式失效情况

vector 向容器插入元素后&#xff1a; 如果容器是vector或string&#xff0c;且存储空间被重新分配&#xff0c;则指向容器的迭代器会失效&#xff1b;如果存储空间未重新分配&#xff0c;指向插入点位置号之前的元素的迭代器仍然有效&#xff0c;但是指向插入点之后的元素的迭…

1039 到底买不买 (20 分)

小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串&#xff0c;但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下&#xff0c;某串珠子里是否包含了全部自己想要的珠子&#xff1f;如果是&#xff0c;那么告诉她有多少多余的珠子&#xff1b;如果…

【Leetcode】111. 二叉树的最小深度

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它的最小深度 2. 解题思路&#xff1a;…

1040 有几个PAT (25 分

字符串 APPAPT 中包含了两个单词 PAT&#xff0c;其中第一个 PAT 是第 2 位(P)&#xff0c;第 4 位(A)&#xff0c;第 6 位(T)&#xff1b;第二个 PAT 是第 3 位(P)&#xff0c;第 4 位(A)&#xff0c;第 6 位(T)。 现给定字符串&#xff0c;问一共可以形成多少个 PAT&#xff…

g

1. 何时需要成员初始化列表&#xff1f;过程是什么&#xff1f; 当初始化一个引用成员变量时&#xff1b;初始化一个const成员变量时&#xff1b;当调用一个基类的构造函数&#xff0c;而构造函数拥有一组参数时&#xff1b;当调用一个成员类的构造函数&#xff0c;而他拥有一组…

【Leetcode | 1】93. 复原IP地址

给定一个只包含数字的字符串&#xff0c;复原它并返回所有可能的 IP 地址格式。 示例: 输入: "25525511135" 输出: ["255.255.11.135", "255.255.111.35"] 方法一&#xff1a; class Solution { public:vector<string> restoreIpAddresse…

1051 复数乘法 (15 分)

复数可以写成 ( 的常规形式&#xff0c;其中 A 是实部&#xff0c;B 是虚部&#xff0c;i 是虚数单位&#xff0c;满足 1&#xff1b;也可以写成极坐标下的指数形式 (&#xff0c;其中 R 是复数模&#xff0c;P 是辐角&#xff0c;i 是虚数单位&#xff0c;其等价于三角形式 (。…

【Leetcode | 13】56. 合并区间

给出一个区间的集合&#xff0c;请合并所有重叠的区间。 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]. 示例 2: 输入: [[1,4],[4,5]] 输出: [[1,5]] 解释: 区间 [1,4] 和 [4,5] 可被视为重叠…

1050 螺旋矩阵 (25 分

本题要求将给定的 N 个正整数按非递增的顺序&#xff0c;填入“螺旋矩阵”。所谓“螺旋矩阵”&#xff0c;是指从左上角第 1 个格子开始&#xff0c;按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列&#xff0c;满足条件&#xff1a;mn 等于 N&#xff1b;m≥n&#xff1b;且…

【Leetcode | 11】268. 缺失数字

给定一个包含 0, 1, 2, ..., n 中 n 个数的序列&#xff0c;找出 0 .. n 中没有出现在序列中的那个数。 示例 1: 输入: [3,0,1] 输出: 2 示例 2: 输入: [9,6,4,2,3,5,7,0,1] 输出: 8 说明: 你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现? class Solution { p…

1053 住房空置率 (20 分)

在不打扰居民的前提下&#xff0c;统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断。判断方法如下&#xff1a; 在观察期内&#xff0c;若存在超过一半的日子用电量低于某给定的阈值 e&#xff0c;则该住房为“可能空置”&#xff1b; 若观察期超过某给定阈值…

1052 卖个萌 (20 分)

萌萌哒表情符号通常由“手”、“眼”、“口”三个主要部分组成。简单起见&#xff0c;我们假设一个表情符号是按下列格式输出的&#xff1a; [左手]([左眼][口][右眼])[右手]现给出可选用的符号集合&#xff0c;请你按用户的要求输出表情。 输入格式&#xff1a; 输入首先在前三…

1054 求平均值 (20 分)

1054 求平均值 &#xff08;20 分&#xff09;本题的基本要求非常简单&#xff1a;给定 N 个实数&#xff0c;计算它们的平均值。但复杂的是有些输入数据可能是非法的。一个“合法”的输入是 [−1000,1000] 区间内的实数&#xff0c;并且最多精确到小数点后 2 位。当你计算平均…