永发信息网

关于C语言中的const修饰符

答案:3  悬赏:0  手机版
解决时间 2021-02-21 02:38
  • 提问者网友:杀手的诗
  • 2021-02-20 14:37
可不可以用const来修饰一个函数啊?就像const int f();这样声明的话,也可以运行啊。
最佳答案
  • 五星知识达人网友:琴狂剑也妄
  • 2021-02-20 15:10
当然可以
便是返回值具有const的特性,即不可被修改
但这么做完全没有意义啊,返回值是函数中某变量的副本,甚至有时可以根本不是变量,而是常量,可不可修改完全没有意义
全部回答
  • 1楼网友:思契十里
  • 2021-02-20 16:31
这个文章很详细: 1、 const修饰的变量是常量还是变量 对于这个问题,很多同学认为const修饰的变量是不能改变,结果就误认为该变量变成了常量。那么对于const修饰的变量该如何理解那? 下面我们来看一个例子: int main { char buf[4]; const int a = 0; a = 10; } 这个比较容易理解,编译器直接报错,原因在于“a = 10;”这句话,对const修饰的变量,后面进行赋值操作。这好像说明了const修饰的变量是不能被修改的,那究竟是不是那,那么下面我们把这个例子修改下: int main { char buf[4]; const int a = 0; buf[4] = 97; printf(“the a is %d\n”,a); } 其中最后一句printf的目的是看下变量a的值是否改变,根据const的理解,如果const修饰的是变量是不能被修改的话,那么a的值一定不会改变,肯定还是0。但是在实际运行的结果中,我们发现a的值已经变为97了。这说明const修饰的变量a,已经被我们程序修改了。 那综合这两个例子,我们来分析下,对于第二例子,修改的原因是buf[4]的赋值操作,我们知道buf[4]这个变量已经造成了buf这个数组变量的越界访问。buf数组的成员本身只有0,1,2,3,那么buf[4]访问的是谁那,根据局部变量的地址分配,可以知道buf[4]的地址和int a的地址是一样,那么buf[4]实际上就是访问了const int a;那么对buf[4]的修改,自然也修改了const int a的空间,这也是为什么我们在最后打印a的值的时候看到了97这个结果。 那么我们现在可以知道了,const修饰的变量是不具备不允许修改的特性的,那么对于第一个例子的现象我们又如何解释那。 第一个例子,错误是在程序编译的时候给出的,注意这里,这个时候并没有生成可执行文件,说明const修饰的变量可否修改是由编译器来帮我们保护了。而第二个例子里,变量的修改是在可执行程序执行的时候修改的,说明a还是一个变量。 综上所述,我们可以得出一个结论,那就是const修饰的变量,其实质是告诉程序员或编译器该变量为只读,如果程序员在程序中显示的修改一个只读变量,编译器会毫不留情的给出一个error。而对于由于像数组溢出,隐式修改等程序不规范书写造成的运行过程中的修改,编译器是无能为力的,也说明const修饰的变量仍然是具备变量属性的。 2、 被const修饰的变量,会被操作系统保护,防止修改 如果对于第一个问题,有了理解的话,那么这个问题,就非常容易知道答案了。const修饰的变量是不会被操作系统保护的。 其原因是操作系统只保护常量,而不会保护变量的读写。那么什么是常量?比如“hello world”这个字符串就是被称为字符串常量。 对于这个问题的另一种证明方法,可以看下面这个程序: int main { const int a; char *buf = “hello world”; printf(“the &a is %p, the buf is %p\n”,&a, buf); } 可以发现buf保存的地址是在0x08048000这个地址附近的,而a的地址是在0xbf000000这个地址附近的,而0x08048000附近的地址在我们linux操作系统上是代码段。这也说明了常量和变量是存放在不同区域的,自然操作系统是会保护常量的。 如果我们知道这个道理后,再看下面的题目: int main { char *buf = “hello”; buf[0] = ‘a’; printf(“the buf is %s\n”,buf); }
  • 2楼网友:白昼之月
  • 2021-02-20 16:01
可以用const修饰函数,记住connst 所修饰对象之后,对象均为只读。 const修饰符能修饰类的成员函数而不能修饰普通的自定义函数,类的成员函数加上了const修饰符后它用两个作用,1:在该函数内不允许对类的私有数据成员进行修改,2:当声明了一个const的该类对象时,该对象只能调用该类的const成员函数而不能调用非const成员函数.如果声明一个非const的该类对象,该对象既可以调用const成员函数也可以调用非const成员函数.
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯