鱼C论坛

 找回密码
 立即注册
查看: 5747|回复: 14

谁帮我归纳一下const

[复制链接]
发表于 2012-7-18 21:56:04 | 显示全部楼层 |阅读模式
10鱼币
const用法每次查,查完忘,忘了又得查,很容易混淆。

拿下来这行代码为例做过讲解吧。 并分享记忆的技巧。
class A
{...};
const  A*  const  func(const  A*  const  one)

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-19 13:13:39 | 显示全部楼层
如果你想考试什么的用记 实际编程中 写个小例子 测试下就OK了
所以是不需要记的
  1. #include <iostream.h>
  2. int main(int argc, char* argv[])
  3. {
  4.         const int n = 5;
  5.     (int&)n = 10;
  6.     //-->
  7.     *(int*)&n = 10;

  8.     int n2 = 15;
  9.     const int* p = &n2;

  10.     const int** p2 = &p;

  11.     p++;
  12.   //  (*p)++; n不可变

  13.     p2++;
  14.     (*p2)++;
  15.   //  (**p2)++;  n2不可变

  16.     const int*& p3 = p;

  17.     p3++; //p可变
  18. //   (*p3)++; n2不可变
  19. //  (**p3)++;




  20.     //你告诉了编译器不可修改 而你又用内存方式修改了值 编译器不认同
  21.     cout << n << endl;
  22.     return 0;
  23. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-7-20 01:03:27 | 显示全部楼层
(1)可以定义const 常量
(2)const 可以修饰函数的参数、返回值,甚至函数的定义体。被const 修饰的东
西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-7-20 08:45:21 | 显示全部楼层
原则上说,const修饰什么,什么就不能变。

如:
1.const int a=5;
这里const修饰int,所以这个int的值初始化后就不能变。

2.int*const pa = NULL;
这里const修饰*,就是修饰指针的意思,所以这个指针的值在初始化后就不能变。

3.const int*const p = ...;
这里后面的const修饰*,所以指针初始化后,值不能变(不能再指向其它对象)
前面的const修饰int,所以不能通过该指针改变其指向数据的值

利用上面的知识:
对于const  A*  const  func(const  A*  const  one)

1.其中函数的参数const  A*  const  one
这个类型中后面的const是修饰*的(修饰指针),所以在函数内不能修改指针的值(不能指向其它对象)
前面的const是修饰A的,就是说在这个函数里不能通过指针one来修改它所指向的数据(不能调用A类的非const成员函数)

2.其中函数的返回值const  A*  const
这个类型中后面的const是修饰*的(修饰指针),所以不能修改返回的指针值(不能指向其它对象)
前面的const是修饰A的,就是说不能通过返回的指针来修改它所指向的数据(不能调用A类的非const成员函数)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-7-20 10:38:24 | 显示全部楼层
小鱼苗
帮顶
顺便混个脸熟
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-7-20 20:11:18 | 显示全部楼层

光老师的回答总是那么经典。太有针对性了。
我能不能做出以下的总结。
const基本上就用在四种场合。
1、普通常量定义。
2、函数参数。
     A:参数类型前,表示所指对象不变。
     B:参数名前,表示参数值不变。
3、函数前。
     A:在返回类型前,表示所指对象不变。
     B:在函数名前,表示返回值不变。
4、成员函数大括号前。
     表示该函数不能修改成员变量。

总结中的总结。
类型前,所指对象不变。
名字前,值不变。
函数体前,成员变量不变。
有没有建议或补充?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-7-20 20:36:51 | 显示全部楼层
类型前,所指对象不变。
名字前,值不变。

这里不对,这两类const都是修饰类型的,只是区分下修饰的类型是不是指针类型。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-7-20 21:55:51 | 显示全部楼层
仰望天上的光 发表于 2012-7-20 20:36
这里不对,这两类const都是修饰类型的,只是区分下修饰的类型是不是指针类型。

我认为如果不是指针,也用不着用const来修饰了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-7-20 22:49:20 | 显示全部楼层
Mr.C 发表于 2012-7-20 21:55
我认为如果不是指针,也用不着用const来修饰了。

比如:
const  int a = 5;和 int const a = 5;是没有任何区别的该const都是修饰int
所以说并不是const总是出现在类型前

但如果const出现在*之后,则这个const必定修饰*所代表的指针类型。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-29 12:03:15 | 显示全部楼层
0.0~    const这个在软件中,  主要用于防止修改数据
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-30 16:57:13 | 显示全部楼层
const 你就将它看成 readonly 就可以了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-1 08:15:57 | 显示全部楼层
也跟着学习一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-21 23:22:20 | 显示全部楼层
看看。。。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-22 00:47:46 | 显示全部楼层
这个问题应该已经解决了吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-25 11:06:47 | 显示全部楼层
上面回答得很多了

1、首先一点需要明确:int const  a 与 const int  a 是一样的,但是建议写成 int const a这种形式,因为可以简单的这么想:
const 限定它 左边的这个东西是不能修改的,如:int const a 代表左边int(a 的值)是不可以修改的;int *const a 代表左边这东西(指向整型的一个指针)不能修改
当然这是种不太严谨的说法
2、稍微严谨的说法是:关键字const并不能把变量变成常量——只是在符号前加上const,表示这个被修饰的符号不能被赋值(也就是它的值对于这个符号来说是只读的);
3、注意:const并不能防止通过程序内部的方法来修改实参指针所指向的数据

对于楼主的例子:
const  A*  const  func(const  A*  const  one)
先把它看成: 类型甲 func(值乙)——这个func函数接受“值乙”,然后运行,运行正常结束后,返回一个值为“类型甲”
1、对于“值乙”:const A* const one, 是不是相当于A const * const one; 函数接受的参数one是一个指向A类型值的指针;不过你不能通过这个变量名one修改这个A类型的值(你不能在函数体内做类似 *one=3 的坏事),也不能通过one修改指向这个值的指针(one就是指向该值的指针啦,你不能在该函数内做类似 one=&some_other_value 的坏事);
2、同理,对于"类型甲": const A* const,是不是就是相当于 A const *const, 如果你在使用该函数的时候是不是类似:value=func(const A* const one);
也就是说返回的这个“类型甲”是一个指向A的指针(value),不过你不能通过此返回的指针value修改该指针指向的这个值,你也不能通过返回的值value修改该指针
   
     
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-9 03:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表