忽然發現C++的const也是件麻煩的東西

WorldCreater 2011-09-24 09:31:27
類 TGMP 已經實現了 運算符重載(加减乘除余 及 大小不等於)等

現在有一个方法 

TGMP TGMP::abs(const TGMP& o) {
if (o>0) //這樣,牠就不能执行了,
}

TGMP.cpp|322|error: passing ‘const TGMP’ as ‘this’ argument of ‘bool TGMP::operator>=(long int)’ discards qualifiers|

估計又是因為這裏:

bool TGMP::operator > (const signed long int o) {
if (mpz_cmp_si(this->value, o)>0) {  ///比較函數中有一個 this->value 的使用
return true;
} else {
return false;
}
}

而我习惯性地想在任何一個不需要被人改變的地方定義一個 “不可更改”的标记
究竟怎麽做才好???
或许,不需要 this-> 限定????我去掉它试试,也许要好许多
大家写過運算符重载的都怎麽写的?
...全文
189 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
WorldCreater 2011-09-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 worldcreater 的回复:]

 運算符重载就無法實現,,而事實上是可以的…
[/Quote]

更正下:我的 const 加减乘函數裏,是以生成新對象來返回的,没有寫入數據。。。加 const 後試下寫入——不行
比较函數的參數加 const 後 bool operator > (const var) const; 後, 能用 var.field的方式調用字段,,,而這個字段原本是在 private 部,不應被這樣調用的。。。。這也是我對 const 感到奇怪的地方,原本我是要提供一個 get 函數來获取字段的,
賦値函數不能在末尾定義 const 而 加减等運算符可以,也是不太明白其中原因
WorldCreater 2011-09-25
  • 打赏
  • 举报
回复
我在網絡上搜到了下面的說明:
可這句話讀起來總覺得有點不明白:“常成员函数, 它不改变对象的成员变量. 也不能调用类中任何非const成员函数。”

成員變量:这是指類的成員變量吧?在我的例子中 TGMP 在 private 部有個 mpz_t value 値,如果定義成 TGMP operator+(var) const; 的運算符重載函數不能修改 “成員變量” 的話,那么 運算符重载就無法實現,,而事實上是可以的

或者,依照我遇到的問題,應該這麽解釋或定義:"const 成員函數是提供給 const 對象可以調用的函數;const 函數只能調用 const 函數;const 對象只能調用其所包含的 const 函數及成員字段(因成員變量不可更改而使用的名詞)"————這段話還缺“它不改变对象的成员变量”的确切描述,希望有人給予解惑,以期完成描述,謝謝

還有,static 和 const 不能同時定義,這時候,大家倾向用什麽?



----------------------------------------------
6. const修饰成员函数

const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰。



class A

{



void function()const; //常成员函数, 它不改变对象的成员变量. 也不能调用类中任何非const成员函数。

}

对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。
WorldCreater 2011-09-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 seucs 的回复:]

因为成员函数后面加修饰符 const 表示调用该成员函数不会修改成员变量,而 TGMP类 的const对象只能调用对应的const成员函数,你在
TGMP TGMP::abs(const TGMP& o) {
if (o>0) //這樣,牠就不能执行了,
}
时传递过去的参数变成了const引用,而const引用不会调用非const成员函数 operator>() ,故将成员函数operator>() 后面加一个const修饰符就可以了
[/Quote]

你在这成员变量指什么???我想保护的是作为参数输入的那个变量!!!
F0X_OO7 2011-09-24
  • 打赏
  • 举报
回复
用const_cast<>()操作符去掉const标签呗
seucs 2011-09-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hongwenjun 的回复:]

引用 1 楼 lazy_2010 的回复:

把你的函数定义修改成

bool TGMP::operator > (const signed long int o) const;


最后一个 const 什么意思
看到有些标准库里的函数这样定义的
[/Quote]

因为成员函数后面加修饰符 const 表示调用该成员函数不会修改成员变量,而 TGMP类 的const对象只能调用对应的const成员函数,你在
TGMP TGMP::abs(const TGMP& o) {
if (o>0) //這樣,牠就不能执行了,
}
时传递过去的参数变成了const引用,而const引用不会调用非const成员函数 operator>() ,故将成员函数operator>() 后面加一个const修饰符就可以了
  • 打赏
  • 举报
回复
TGMP TGMP::abs(const TGMP& o) {
if (o>0) //這樣,牠就不能执行了,
}

在你这里 进行 o>0的操作,其实会调用
bool TGMP::operator > (const signed long int o);
但是你上面的 o是一个const对象,而const对象只能调用 const成员函数,所以有两种办法

1、
TGMP TGMP::abs(TGMP& o) { //去掉const
if (o>0) //這樣,牠就不能执行了,
}


bool TGMP::operator > (const signed long int o) {
if (mpz_cmp_si(this->value, o)>0) {  ///比較函數中有一個 this->value 的使用
return true;
} else {
return false;
}
}


2、

TGMP TGMP::abs(const TGMP& o) {
if (o>0) //這樣,牠就不能执行了,
}



bool TGMP::operator > (const signed long int o) const{ //const成员函数
if (mpz_cmp_si(this->value, o)>0) {  ///比較函數中有一個 this->value 的使用
return true;
} else {
return false;
}
}
hongwenjun 2011-09-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lazy_2010 的回复:]

把你的函数定义修改成

bool TGMP::operator > (const signed long int o) const;
[/Quote]

最后一个 const 什么意思
看到有些标准库里的函数这样定义的
lazy_2010 2011-09-24
  • 打赏
  • 举报
回复
把你的函数定义修改成

bool TGMP::operator > (const signed long int o) const;
iamnobody 2011-09-24
  • 打赏
  • 举报
回复
如果要用const 就要用全套的。
if(o>0);
这个操作是o.operator>(0);也就是o调用了一个在编译器看来是一个可能会改变o的成员函数。如1楼所说,声明为const,即可。
WorldCreater 2011-09-24
  • 打赏
  • 举报
回复
条件:TGMP類 實現了 全部的 加减乘除模 及 比較 運算符的重載
再比如 class Point {
TGMP a,b,c;
}

函數 ClassA::proc(const Point& op1, const Point& op2) {
Point r;

r.a = op1.a - op2.a; //這樣的操作也不行了 錯誤提示是 const 与 this 指針
///如果再想要運算必須,e.g.
TGMP x, y;
x = op1.b; y = op2.b;
r.b = x.b - y.b;
}

64,684

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧