static、const总结

本文详细解析了C++中static和const关键字的功能与用法,包括static在函数和变量中的作用、const在变量、指针及成员函数中的应用。

参考了网上的资料,表示感谢。在此总结下,方便查找。

一、static

1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)
当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。

利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏。(面试被问到)

2.static的第二个作用是保持变量内容的持久。(static变量中的记忆功能和全局生存期)

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。

PS:如果作为static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。

基于以上两点可以得出一个结论:把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。

3.static的第三个作用是默认初始化为0(static变量)

4.static的第四个作用:C++中的类成员声明static

在类中声明static变量或者函数时,初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员,这样就出现以下作用:

(1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致了它仅能访问类的静态数据和静态成员函数。      

(2)不能将静态成员函数定义为虚函数。如果定义为虚函数,那么它就是动态绑定的,也就是在派生类中可以被覆盖的,这与静态成员函数的定义本身就是相矛盾的。

静态成员可以被继承,这时,基类对象和派生类的对象共享该静态成员,除此之外,在类等级中对静态成员的其他特性(例如,静态成员在派生类中的访问权限,在派生类中重载成员函数等)的分析与一般成员类似。

(3)static并没有增加程序的时空开销,相反她还缩短了子类对父类静态成员的访问时间,节省了子类的内存空间。      

(4)静态数据成员在<定义或说明>时前面加关键字static。静态成员初始化与一般数据成员初始化不同:

初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;
初始化时不加该成员的访问权限控制符private,public等;        
初始化时使用作用域运算符来标明它所属类(只有静态整型常量才能在类中初始化);
所以我们得出静态数据成员初始化的格式:<数据类型><类名>::<静态数据成员名>=<值>

(5)为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。这里有一点需要注意:我们说静态成员为父类和子类共享,但我们有重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器采用了一种绝妙的手法:name-mangling 用以生成唯一的标志。(没验证)

静态成员函数有特点:

1.静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;

2.非静态成员函数可以任意地访问静态成员函数和静态数据成员;

3.静态成员函数不能访问非静态成员函数和非静态数据成员;

4.调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以用类名::函数名调用。

另请看http://blog.youkuaiyun.com/e_road_by_u/article/details/52227578这篇以前写关于静态成员函数的。

二、const

为什么使用const?采用符号常量写出的代码更容易维护;指针常常是边读边移动,而不是边写边移动;许多函数参数是只读不写的。

用法1:常量
取代了C中的宏定义,声明时必须进行初始化(!c++类中则不然,利用初始化列表进行初始化)。
用const声明的变量虽然增加了分配空间,但是可以保证类型安全。

c中不可以用const变量作为数组的大小,但c++中可以。

用法2:指针和常量
使用指针时涉及到两个对象:该指针本身和被它所指的对象。将一个指针的声明用const“预先固定”将使那个对象而不是使这个指针成为常量。要将指针本身而不是被指对象声明为常量,必须使用声明运算符*const。

用法3:const修饰函数传入参数
将函数传入参数声明为const,以指明使用这种参数仅仅是为了效率的原因,而不是想让调用函数能够修改对象的值。同理,将指针参数声明为const,函数将不修改由这个参数所指的对象。
通常修饰指针参数和引用参数。

用法4:修饰函数返回值
可以阻止用户修改返回值。返回值也要相应的赋给一个常量或常指针。

用法5:const修饰成员函数(c++特性)
const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数;
const对象的成员是不能修改的,而通过指针维护的对象确实可以修改的;
const成员函数不可以修改对象的数据,不管对象是否具有const性质。编译时以是否修改成员数据为依据进行检查。(用const修饰的类成员函数,在该函数体内不能改变该类对象的任何成员变量, 也不能调用类中任何非const成员函数。用const修饰的类成员变量,只能在类的构造函数初始化列表中赋值,不能在类构造函数体内赋值。)

另请看http://blog.youkuaiyun.com/E_ROAD_BY_U/article/details/52215193以前写的关于const的总结

const与宏定义的区别

const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。
const常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
另外,编译器通常不为const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
<think>嗯,用户问的是“static constconst static的区别”。首先,我需要确定这两个关键字在C/C++中的作用以及它们的顺序是否会影响含义。 首先,static关键字在C/C++中有不同的用途。在全局变量或函数中,static限制了它们的链接性,使得它们只能在当前编译单元内访问。而在类的成员变量中,static表示该变量属于类而不是类的实例,所有对象共享同一个静态成员。 然后是const关键字,它用来声明常量,表明该变量的值不能被修改。在C++中,const变量默认具有内部链接,也就是它们的作用域被限制在当前编译单元。 现在的问题是这两个关键字的顺序是否影响。比如,在C++中,static constconst static是否等价?我记得在C++中,修饰符的顺序通常不影响,但可能在某些上下文中会有不同的效果。例如,在类的成员变量中,static const int是合法的,而const static int可能看起来不太常见,但可能也是正确的。 需要回忆C++的标准。根据C++标准,声明符的顺序通常不影响,除了在某些特定的情况下,比如volatile和const的组合。对于staticconst,它们的顺序不影响,所以static constconst static是等价的。不过,这可能在不同的编译器中有没有差异?需要确认。 另外,在C语言中,staticconst的顺序是否有区别?在C中,const变量默认外部链接,所以如果声明为static const,那么变量的作用域被限制到当前文件。而const static应该也是同样的效果,所以顺序不影响。 可能用户是在编写代码时遇到了这两种写法,或者在阅读别人的代码时产生了疑问。需要进一步考虑用户可能的背景。比如,用户可能是在C或C++中遇到这个问题,但问题中没有明确说明。这时候需要分别解释两种语言的情况。 另外,用户可能想知道是否有最佳实践或常见的写法推荐。例如,通常C++程序员更倾向于使用static const的顺序,而const static虽然正确,但可能不常见。 还需要检查是否有例外情况。例如,在类内部的静态常量成员,是否必须使用static const,或者是否允许const static。例如: class MyClass { static const int a = 10; // 合法 const static int b = 20; // 是否也合法? }; 在C++中,这两种都是合法的,所以顺序不影响。 总结:在C和C++中,staticconst的顺序不影响,两者等价。但通常习惯写法是static const,可能更常见。 然后需要给出示例,说明两者的等价性,并指出常见的用法。同时提醒用户注意不同语言中的情况,比如C和C++中的处理是否一致。 可能的相关问题包括:这两种写法的使用场景、是否影响变量的链接性、在类中的不同用法、历史原因导致的写法差异等。</think>在C/C++中,`static const`和`const static`的**语义完全相同**,仅书写顺序不同。编译器会将两者视为等价的组合,均表示“静态常量”。以下是具体分析: --- ### 核心结论 - **顺序无关性**:C/C++标准规定,类型修饰符(如`static`、`const`、`volatile`)的顺序不影响最终含义。因此: ```cpp static const int A = 10; // 合法 const static int B = 20; // 合法且等效 ``` - **常见写法**:`static const`更符合主流代码风格,因其强调“静态属性优先”(如类成员变量的声明习惯)。 --- ### 典型应用场景 1. **文件作用域的常量**(C/C++): ```cpp // 限制变量仅在当前文件可见(内部链接) static const float PI = 3.14159f; ``` 2. **类的静态常量成员**(C++): ```cpp class MyClass { public: static const int MAX_SIZE = 100; // 推荐写法 // const static int MAX_SIZE = 100; // 同样合法 }; ``` --- ### 注意事项 - **C与C++的差异**: - 在C语言中,`static const`变量默认具有内部链接,而C++中`const`变量默认已是内部链接(即使不加`static`)。 - **历史遗留代码**:某些旧代码可能因个人习惯或编译器兼容性使用`const static`,但现代标准无影响。 --- ### 示例对比 ```cpp // 写法1:static const static const int Threshold = 50; // 写法2:const static(完全等效) const static int Threshold = 50; ``` 两者均保证: - 变量生命周期为程序运行期; - 值不可修改; - 作用域被限制在声明所在的文件或类中。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值