鱼C论坛

 找回密码
 立即注册
查看: 1846|回复: 3

[已解决]关于const修饰符的问题,难道使用const就一定会这么纠结么

[复制链接]
发表于 2018-12-13 20:21:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近在尝试自己实现一些数据结构。为了小甲鱼说的养成良好的习惯嘛,试着在能加上const修饰符的地方尽量加上,但是发现了一些const在继承上的很纠结的问题。
比如说这样一个程序:

  1. class Obj
  2. {
  3. public:
  4.         int value;
  5. };

  6. class A
  7. {
  8. private:
  9.         Obj t;

  10.         Obj &func1()
  11.         {
  12.                 Obj *p = &t;
  13.                 //如果这是某个复杂的实现,有其他函数也需要使用,所以不能加const修饰自身
  14.                 return *p;
  15.         }
  16. public:
  17.         const int func1_value() const //会报错,因为这个函数的this指针类型为const A而A::func1()的this指针类型是A&
  18.         {
  19.                 return func1().value;
  20.         }

  21.         bool set_func1_value(int i)
  22.         {
  23.                 func1().value = i;
  24.         }
  25. };


复制代码


作为强迫症,总是想在func_value()后面加上const..但是这样一定会报错。。如果我一定想要实现每一个不做具体改动public函数都有const修饰的话,难道需要再写一个完全一样只是使用了const修饰的func1么,有什么其他的办法么
最佳答案
2018-12-14 18:04:44

  1. class Obj
  2. {
  3. public:
  4.         int value;
  5. };

  6. class A
  7. {
  8. public:
  9.         Obj t;

  10.         Obj &func()
  11.         {
  12.                 const Obj &p = static_cast<const A &>(*this).func();
  13.                 return const_cast<Obj &>(p);
  14.         }

  15.         const Obj &func() const
  16.         {
  17.                 const Obj *p = &t;
  18.                 // ...
  19.                 return *p;
  20.         }

  21.         const int func1_value() const
  22.         {
  23.                 return func().value;
  24.         }

  25.         bool set_func1_value(int i)
  26.         {
  27.                 func().value = i;
  28.         }
  29. };
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-12-13 22:11:27 | 显示全部楼层
  1. Obj &func1()
  2.         {
  3.                 Obj *p = &t;
  4.                 //如果这是某个复杂的实现,有其他函数也需要使用,所以不能加const修饰自身
  5.                 return *p;
  6.         }
复制代码

  1. const int func1_value() const //会报错,因为这个函数的this指针类型为const A而A::func1()的this指针类型是A&
  2.         {
  3.                 return func1().value;
  4.         }
复制代码


func1_value是const的,也就是func1_value保证自己不修改当前对象,这也就意味着func1_value函数只能调用 保证不修改当前对象的函数(const函数),func1没有做这样的保证,所以func1_value函数不能调用func1
修改的确是在func1内部进行的,但是func1_value调用了func1,可以认为是func1_value间接修改了当前对象,间接修改也还是修改,func1_value保证自己不修改当前对象,所以func1_value函数不能调用func1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-13 23:17:08 | 显示全部楼层
本帖最后由 Croper 于 2018-12-13 23:20 编辑

我大概知道是这么回事
现在的问题是func_1的实现如果需要写很长一段代码,返回的是Obj的一个实例,但是func_1的函数内部并没有显式地修改当前对象
之所以func_1不加const的原因是的原因是其他调用func_1的函数可能会修改这个实例。
比如在这个例子中set_func1_value也调用了func_1的返回值
  1.         bool set_func1_value(int i)
  2.         {
  3.                 func1().value = i;
  4.         }
复制代码

如果把func_1改成const的那么set_func1_value又会报错

我知道如果改成这样,是能达到我想要的效果的

  1. class A
  2. {
  3. public:
  4.         Obj t;

  5.         Obj &func1()
  6.         {
  7.                 Obj *p = &t;
  8.                 //如果这是某个复杂的实现,返回的值可能是t,有其他函数也需要使用,所以不能加const修饰自身
  9.                 return *p;
  10.         }

  11.         const Obj &func1_const() const //新建一个函数func1_const,和func_1完全一样,仅仅是比func1多了几个个const
  12.         {
  13.                 const Obj *p = &t;
  14.                 //这里是和func1完全相同的代码,一点都不变,
  15.                 return *p;
  16.         }
  17.        
  18.         const int func1_value() const
  19.         {
  20.                 return func1_const().value;       //改成调用func1_const的返回值
  21.         }

  22.         bool set_func1_value(int i)
  23.         {
  24.                 func1().value = i;
  25.         }
  26. };
复制代码


但是这样显得好蠢,同样的代码谢了两次。。维护也麻烦啊。就不能有什么办法使得代码能够复用,让const int func1_value在调用func_1的同时保证自身的const么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-14 18:04:44 | 显示全部楼层    本楼为最佳答案   

  1. class Obj
  2. {
  3. public:
  4.         int value;
  5. };

  6. class A
  7. {
  8. public:
  9.         Obj t;

  10.         Obj &func()
  11.         {
  12.                 const Obj &p = static_cast<const A &>(*this).func();
  13.                 return const_cast<Obj &>(p);
  14.         }

  15.         const Obj &func() const
  16.         {
  17.                 const Obj *p = &t;
  18.                 // ...
  19.                 return *p;
  20.         }

  21.         const int func1_value() const
  22.         {
  23.                 return func().value;
  24.         }

  25.         bool set_func1_value(int i)
  26.         {
  27.                 func().value = i;
  28.         }
  29. };
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 23:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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