高手请进,求解C++的const问题

swing07 2012-10-21 07:14:48
如下所示:
class COMPLEX
{
public:
COMPLEX operator+(const COMPLEX &p){COMPLEX r; r.x = x + p.x; r.y = y + p.y; return r;}
private:
double x,y;
};

COMPLEX fun(const COMPLEX &p1,const COMPLEX &p2)
{
COMPLEX result;
result = p1 + p2;
return result;
}
编译时提示:二进制“+”: 没有找到接受“const COMPLEX”类型的左操作数的运算符(或没有可接受的转换)
不理解为什么,函数fun的参数1,参数2都是传入参数const可以保护不被改动,为什么编译不过,岂不是语言有bug?
...全文
208 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaolomg 2012-10-22
  • 打赏
  • 举报
回复
应该是没有合适的operator函数
swing07 2012-10-22
  • 打赏
  • 举报
回复
多谢 给位我找到 解释的原因了。
关于const形参和非const形参:
在C++两种传值方式中,以值传递,const变量和非const变量可以互相传递,因为他们实际是传递一个拷贝,不会威胁原来的数据属性。
而引用传值(传地址)会威胁到原有数据属性(违反const语义)。
所以对以引用传递来说:一个const类型的实参是不能传递给非const类型的形参的(但是GCC,仅仅是给出警告信息,提示discard qualifiers),反过来可以。
所以下面程序:出错原因是一个const类型的实参传递给了非const的形参。
class COMPLEX
{
public:
COMPLEX operator+(const COMPLEX &p){COMPLEX r; r.x = x + p.x; r.y = y + p.y; return r;}
private:
double x,y;
};

COMPLEX fun(const COMPLEX &p1,const COMPLEX &p2)
{
COMPLEX result;
result = p1 + p2;
return result;
}
王炎林 2012-10-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
如下所示:
class COMPLEX
{
public:
COMPLEX operator+(const COMPLEX &p){COMPLEX r; r.x = x + p.x; r.y = y + p.y; return r;}
private:
double x,y;
};

COMPLEX fun(const COMPLEX &p1,……
[/Quote]

个人觉得是因为在fun中声明的参数类型p1是const COMPLEX&类型的,因此在进行操作符重载调用的时候,会去寻找相应的声明为const的函数。但是你定义的加号的重载函数不是一个const的函数,所以这里没有找到相应的函数。像10楼所说的那样,要么将运算符重载函数声明为const,要么把fun中的p1参数的const去掉。像下面这样


class Complex
{
public:
Complex operator+(const Complex& r)
{
Complex result;
result.x=x+r.x;
result.y=y+r.y;
return result;
}
private:
double x,y;
};
Complex fun(Complex& p1,const Complex& p2)
{
Complex result;
result = p1.operator+(p2);
return result;
}
wjain 2012-10-21
  • 打赏
  • 举报
回复
你的程序

class COMPLEX
{
public:
COMPLEX operator+( COMPLEX p) {COMPLEX r; r.x = x + p.x; r.y = y + p.y; return r;}
private:
double x,y;
};

COMPLEX fun(const COMPLEX p1,const COMPLEX p2)
{
COMPLEX result;
result = p1 + p2;
return result;
}


gcc编译输出:

gcc -c Complex.cpp -g -Wall
Complex.cpp: In function 'COMPLEX fun(COMPLEX, COMPLEX)':
Complex.cpp:12:19: error: passing 'const COMPLEX' as 'this' argument of 'COMPLEX COMPLEX::operator+(COMPLEX)' discards qualifiers

Compilation exited abnormally with code 1 at Sun Oct 21 21:08:42


修改后:

class COMPLEX
{
public:
COMPLEX operator+( COMPLEX p) const {COMPLEX r; r.x = x + p.x; r.y = y + p.y; return r;}
private:
double x,y;
};

COMPLEX fun(const COMPLEX p1,const COMPLEX p2)
{
COMPLEX result;
result = p1 + p2;
return result;
}


编译通过。

gcc的输出已经说明了原因,楼主自己再思考一下吧。
swing07 2012-10-21
  • 打赏
  • 举报
回复
不是很理解 求解释
swing07 2012-10-21
  • 打赏
  • 举报
回复
这样编译没有问题
class COMPLEX
{
public:
COMPLEX operator+( COMPLEX p) {COMPLEX r; r.x = x + p.x; r.y = y + p.y; return r;}
private:
double x,y;
};

COMPLEX fun( COMPLEX p1, COMPLEX p2)
{
COMPLEX result;
result = p1 + p2;
return result;
}
这样编译有问题:
class COMPLEX
{
public:
COMPLEX operator+( COMPLEX p) {COMPLEX r; r.x = x + p.x; r.y = y + p.y; return r;}
private:
double x,y;
};

COMPLEX fun(const COMPLEX p1,const COMPLEX p2)
{
COMPLEX result;
result = p1 + p2;
return result;
}
swing07 2012-10-21
  • 打赏
  • 举报
回复
可以的 我在VS2008下 没问题
wangjiehua321 2012-10-21
  • 打赏
  • 举报
回复
是啊 我也觉得奇怪啊
derekrose 2012-10-21
  • 打赏
  • 举报
回复
我感觉奇怪的是 r.x可以通过编译么
mujiok2003 2012-10-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
COMPLEX operator+(const COMPLEX &p) const {
楼主,换本合格的教材吧
[/Quote]

++
swing07 2012-10-21
  • 打赏
  • 举报
回复
const COMPLEX &p 内 容不可变
int const * p 指针不可变 记住这一个就可以了。其他都是内容不可变

const int *p,表示指向const 变量的指针,const COMPLEX &p在程序看来是没有问题的啊,把const去掉也会有同样的问题
_暮落_ 2012-10-21
  • 打赏
  • 举报
回复
const COMPLEX &p 内 容不可变
int const * p 指针不可变 记住这一个就可以了。其他都是内容不可变
taodm 2012-10-21
  • 打赏
  • 举报
回复
COMPLEX operator+(const COMPLEX &p) const {
楼主,换本合格的教材吧

65,186

社区成员

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

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