首页 > 试题广场 >

请说出static和const关键字尽可能多的作用

[问答题]
请说出static和const关键字尽可能多的作用
static:
1. 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在main函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。
2. 修饰普通函数,表明函数的作用范围,仅在定义该函数的文件内才能使用。在多人开发项目时,为了防止与他人命令函数重名,可以将函数定位为static。
3. 修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。
4. 修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在static函数内不能访问非静态成员。
const:
1. 修饰变量,说明该变量不可以被改变;
2. 修饰指针,分为指向常量的指针和指针常量;
3. 常量引用,经常用于形参类型,即避免了拷贝,又避免了函数对值的修改;
4. 修饰成员函数,说明该成员函数内不能修改成员变量。
发表于 2017-07-30 18:57:54 回复(0)
更多回答
一、 static 关键字
1.隐藏性,在变量或函数用static修饰,或缩小使用个范围,将此变量或函数只在本文件中使用,其他文件看不到。
2.变量内容的持久性,程序在一开始就已经初始化了,且变量存在data段上,只有当整个程序结束时,变量才会销毁,即可以保存上一次修改的变量值。
3.static 变量 ,默认值为0,减少程序员的操作。
4.在C++中,static可以修饰成员变量,只在该类内可见,也可以修饰成员方法。
    静态成员方法归类所有,不归对象所有。因为静态成员方法的调用不依赖对象,无this指针,不用实例化对象。
二、const
1. .const可以修饰变量、形参、返回值 ,防止数据被修改, 提高函数 的健壮性。
2.const定义的变量,在编译阶段会进行类型检查,而宏,只是单纯的在预编阶段进行字符串的替换。
3.const定义的变量,使用的时候是将内存附上,而宏是提供了一个立即数,即,const一经定义,只有一份,而宏出现多次。减少内存的使用。
4.const修饰指针,一级指针、二级指针的转换情况。
5.在C++的类中,const修饰的成员方法为常方法,常变量可以调用常方法不能调用普通方法、普通变量可以调用常方法也可以调用普通方法。
发表于 2017-07-03 17:27:59 回复(0)
static强调变量重复使用同一份,以及在变量在函数体内、变量在模块内、函数体在模块内的作用域;
const强调所修饰对象的不可更改,得到常量和常函数。
发表于 2016-02-23 19:47:28 回复(0)
1 staic 用作全局变量,变量文件独立,
2 static 用作函数,函数不被共享
3 static 用作函数内部的局部变量, 是为函数内部循环利用
4 static静态变成员量,是为类的共享重复利用
5 static静态成员函数相当于类内全局函数,所以没有虚函数。
1 const 指针/引用,指向常量字符串,函数返回值是临时变量的情况。
2 const类对象,只能调用const函数,
3 const成员变量,如果内置类型,必须显示初始化,或者类内初始化。
4 const成员函数本身,不改变类内非const成员变量的值。
5 const函数返回值,一般不要是const,除非重载运算符,引用也不要是const,尤其对于连续赋值的赋值运算符。
6 const引用用作构造函数参数,
7 const函数内部参数,不要被当作返回值的引用返回,


发表于 2017-10-20 21:50:34 回复(0)
https://zhidao.baidu.com/question/217729885.html

static定义变量的使用:
一、静态局部变量:
1、Static类内部变量同auto自动变量(即未加 Static 声明的局部变量)一样,是某个特定函数的局部变量,即只能在定义该变量的函数内使用该变量,2者作用域相同;两者的不同在于:auto自动变量会随着函数被调用和退出而存在和消失,而static类局部变量不会,它不管其所在的函数是否被调用,都将一直存在;不过,尽管该变量还继续存在,但不能使用它。倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。换言之,Static类型的内部变量是一种只能在某个特定函数中使用,但一直占据存储空间的变量。
2、函数体内如果在定义静态变量的同时进行了初始化,则以后程序不再进行初始化操作(出现在函数内部的基本类型的的静态变量初始化语句只有在第一次调用才执行)。而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
3、静态局部变量的初始化表达式必须是一个常量或者常量表达式。即使局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量);静态变量的初始值为0。而对自动变量auto来说,如果不赋初值则它的值将是个不确定的值。
4、当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。
注:局部静态变量占用内存时间较长,并且可读性差,因此,除非必要,尽量避免使用局部静态变量。

二、静态全局变量
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。

这两者的区别虽在于:
1、非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
2、静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。

由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

从以上分析可以看出————
把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
因此static这个说明符在不同的地方所起的作用是不同的。应予以注意。

发表于 2017-06-14 11:43:17 回复(0)
【解答】 static关键字至少有下列n个作用:
  (1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;  
(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;  
(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;  
(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;  
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。   
const关键字至少有下列n个作用:  
(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;  
(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;  
(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;  
(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的 成员变量;  
(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。例如:  
const classA operator*(const classA& a1,const classA& a2);  
operator*的返回结果必须是一个const对象。如果不是,这样的变态代码也不会编译出错:  
classA a, b, c;  
(a * b) = c; // 对a*b的结果赋值  
操作(a * b) = c显然不符合编程者的初衷,也没有任何意义。  
编辑于 2015-10-29 09:52:53 回复(0)

1.第一种面向对象的静态成员变量,在类成员变量的声明前加上static关键字,就是静态成员变量了。静态成员变量有以下特点,①静态成员变量是该类所有对象所共有的,无论这个类的对象被定义了多少个,静态成员变量只分配一次内存,它的值对每个对象都一样,而且可以更新。②.不属于特定的类对象,不占对象的内存,它的内存在全局数据区③.内存空间的分配不是声明类时分配也不是实例化对象时分配,是在初始化时分配,静态成员变量必须初始化(是否赋初始值无所谓,默认为0),而且只能在类外初始化。④.可以通过类和对象访问⑤.sizeof()不会计算静态成员变量。它比全局变量的优势是不存在和其他全局命名变量冲突的问题,而且可以实现信息隐藏,可以将其定义为private,它和普通成员变量一样遵循public/private等访问规则。

2.面向对象的静态成员函数。有以下几个特点,①.为类服务,而不是为某个对象服务。因为不作用于对象,所以该函数内不存在指向对象本身的this指针,无法访问类的非静态成员变量和非静态成员函数,只能调用其余静态成员。②.可以通过类和对象来调用该函数。不能将虚函数定义为静态成员函数,因为虚函数调用时要通过this指针来控制虚函数表指针。

3.面向过程的静态全局变量(应用于普通的变量和函数,不涉及类)有以下特点①.该变量在全局数据区分配内存②.未经初始化的静态全局变量初始化为0。③.静态全局变量在声明它的整个文件可见,在文件之外不可见。比起全局变量的好处是其他文件可以定义相同名字的变量不会发生冲突。要注意的是不要在头文件声明静态全局变量,会造成重复定义。

4.静态局部变量,特点①.在全局数据区分配内存。②.首次执行到该对象的声明处进行初始化,后面再次调用该函数不再进行初始化(默认初始化为0)。③.驻留在全局数据域,直到程序运行结束。但是作用域为局部作用域,所以当它的函数或语句块结束时,作用域也随之结束。

5.面向过程的静态函数:只能在声明它的文件可见,不能被其他文件使用。

发表于 2021-02-25 14:44:35 回复(0)
<p>Static:限制调用范围,储存在静态域储存区,只定义一次,定义可以不赋值,可更改值</p><p>Const:定义时必须赋值,定义后不可更改,</p>
发表于 2020-09-13 17:48:09 回复(0)
const
发表于 2020-04-05 22:39:37 回复(0)

补充复习:

const char *p和 char const *p都是常量指针,即p所指向的值是常量,但是p本身的指向是可以修改的;char *const p是指针常量,指针本身不可修改但指向的值可以修改

发表于 2020-03-26 18:38:08 回复(0)
const第五点描述有问题。使得this所指对象是const的,这么说没问题,但是说返回值是不为左值的就有问题了,首先成员函数不一定返回*this,就算返回*this也是const的,而不能说是不为左值的,是否const和是左右值是没关系的。
发表于 2020-02-18 17:57:12 回复(0)
发表于 2019-04-12 09:42:04 回复(0)
static 修饰的变量默认初始化为零
发表于 2017-05-25 22:08:33 回复(0)
第5个有问题,返回值类型加const 失去作用 引用加const才有用。一个值 本来就具有常量性质
发表于 2016-03-28 16:19:36 回复(1)