const的一些问题
(1)在类中为何不能定义如下函数:
static void f() const {};
有人说是因为const要修饰this,static没有this所以出错,这个理由不大理解,希望能详细点。
(2)对于声明为const并且分配了内存空间的局部变量它们在内存中是在栈上还是常量区?如果是放在栈上,通过什么机制来保护其不被修改,如果是放在常量区,那应该是在编绎阶段就放在常量区了,并且也不用入栈了?
[解决办法]
(1)static void f() const {};类的非static成员函数都有一个隐式的参数this,根据函数的const 和非const 指定参数this为const 或非const属性
(2)分配在栈上,不能修改。
[解决办法]
看effective C++吧
[解决办法]
#include <iostream>
using namespace std;
int x=10; //全局数据区,也是静态数据区
const int y=10; //常量区
char* const e= "hello "; //常量区
void main()
{
char* a= "hello "; //栈
static char* b= "hello "; //全局数据区,也是静态数据区
const char* c= "hello "; //栈,和a一样
char* const d= "hello "; //栈
const int z=10; //栈中 和 Y的 区别
cout < < "a: " < <(void *)&a < <endl;
cout < < "b: " < <(void *)&b < <endl;
cout < < "c: " < <(void *)&c < <endl;
cout < < "d: " < <(void *)&d < <endl;//
cout < < "x: " < <(void *)&x < <endl;//
cout < < "y: " < <(void *)&y < <endl;
cout < < "z: " < <(void *)&z < <endl;
cout < < "e: " < <(void *)&e < <endl;
}
自己看地址区分吧,主要区分 y 和 z ; d 和 e;
放的地方不一样分配的时候也不一样
[解决办法]
现在归纳一下,如有不妥就请老鸟指正
1.static和const关键字不能同时修饰函数体(但是const可以修饰static函数的参数或者返回值),因为static成员函数是属于所在类,并非该类的特定对象,然而非static成员函数是属于特定对象的,非static的const函数(确保该成员函数不修改其他数据成员)是非static函数的一种特例,因而两者同时修饰函数体会产生矛盾,编译不能通过.
2.全局变量与static变量存放在全局数据区.
[解决办法]
确实,const只是在编译阶段对其保护,当运行时,常量被送到只读内存中,被操作系统保护了。