关于函数使用const参数

clouddeng 2006-04-30 11:16:53
这是我定义的Polynomial.h

//Polynomial.h
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sstream>
#include <math.h>
#include <string>
#include <vector>
using namespace std;

class Polynomial {
vector<long> coefs;
public:
Polynomial();
Polynomial(int);
Polynomial(const vector<long>&);
Polynomial(const string&);
Polynomial(const Polynomial&);
~Polynomial();
const int degree();
const vector<long> coefficients();
bool operator==(const Polynomial&);
Polynomial& operator+=(const long);
};


实现如下:(Polynomial.cpp)

#include "Polynomial.h"

Polynomial::Polynomial(){
}

Polynomial::Polynomial(int coef){
coefs.push_back(coef);
}

Polynomial::Polynomial(const vector<long>& vec){
for(int i=0; i<vec.size(); i++){
coefs.push_back(vec.at(i));
}
}

Polynomial::Polynomial(const string& str){
istringstream iss(str);
for(int i=0; i<ceil(str.length()/2); i++)
iss>>coefs[i];

}

Polynomial::Polynomial(const Polynomial& q){
for(int i=0; i<q.degree(); i++)
coefs[i]=q.coefs[i];
}

Polynomial::~Polynomial(){
if(coefs.capacity()!=0){
delete(&coefs);
}
}

const int Polynomial::degree(){
return coefs.size();
}


const vector<long> Polynomial::coefficients(){
return coefs;
}


bool Polynomial::operator==(const Polynomial& right){
if(degree()!=right.degree()) return false;
for(int i=0; i<degree(); i++){
if(coefs.at(i)!=right.coefs.at(i)) return false;
}
return true;
}

Polynomial& Polynomial::operator+=(const long k){
coefs.at(0)+=k;
return *this;
}

报错:
Polynomial.cpp: In copy constructor 'Polynomial::Polynomial(const Polynomial&)':
Polynomial.cpp:27: error: passing 'const Polynomial' as 'this' argument of 'const int Polynomial::degree()' discards qualifiers
Polynomial.cpp: In member function 'bool Polynomial::operator==(const Polynomial&)':
Polynomial.cpp:47: error: passing 'const Polynomial' as 'this' argument of 'const int Polynomial::degree()' discards qualifiers


看起来好像是使用degree()这个const函数是出了问题。这是怎么回事啊,我知道只有const实例才能使用const函数,我是按照这样子来写的阿,请教中
...全文
221 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
clouddeng 2006-04-30
  • 打赏
  • 举报
回复
那其不是常引用的引用能不能调用一个常方法??就是比如
Polynomial polyno(2);
int i=polyno.degree(); //degree是int degree() const
铖邑 2006-04-30
  • 打赏
  • 举报
回复
const int degree() 表示返回值不可修改,如果不是引用或指针的话,没有什么意义。
int degree() const 表示这个函数是一个常函数/方法,只有常引用可以调用,常引用不能调用其它类型的函数(也就是不带有const修饰的函数)
glchen57 2006-04-30
  • 打赏
  • 举报
回复
const int degree()那个const 是修饰返回值的,这个地方你返回的是内部类型int,所以没必要加
int degree() cont const修饰的是这个成员函数,
铖邑 2006-04-30
  • 打赏
  • 举报
回复
给你一个比较标准一点的写法吧:

//Polynomial.h
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sstream>
#include <math.h>
#include <string>
#include <vector>

class Polynomial {
std::vector<long> coefs;
public:
Polynomial();
Polynomial(int);
Polynomial(const std::vector<long>&);
Polynomial(const std::string&);
Polynomial(const Polynomial&);
~Polynomial();
int degree() const;
const std::vector<long> coefficients();
bool operator==(const Polynomial&);
Polynomial& operator+=(const long);
};


//Polynomial.cpp
#include "Polynomial.h"

using namespace std;

Polynomial::Polynomial(){
}

Polynomial::Polynomial(int coef){
coefs.push_back(coef);
}

Polynomial::Polynomial(const vector<long>& vec){
for(int i=0; i<vec.size(); i++){
coefs.push_back(vec.at(i));
}
}

Polynomial::Polynomial(const string& str){
istringstream iss(str);
for(int i=0; i<ceil(str.length()/2); i++)
iss>>coefs[i];

}

Polynomial::Polynomial(const Polynomial& q){
for(int i=0; i<q.degree(); i++)
coefs[i]=q.coefs[i];
}

Polynomial::~Polynomial(){
if(coefs.capacity()!=0){
delete(&coefs);
}
}

int Polynomial::degree() const{
return coefs.size();
}


const vector<long> Polynomial::coefficients(){
return coefs;
}


bool Polynomial::operator==(const Polynomial& right){
if(degree()!=right.degree()) return false;
for(int i=0; i<degree(); i++){
if(coefs.at(i)!=right.coefs.at(i)) return false;
}
return true;
}

Polynomial& Polynomial::operator+=(const long k){
coefs.at(0)+=k;
return *this;
}

可以编译通过
clouddeng 2006-04-30
  • 打赏
  • 举报
回复
int degree() const;和const int degree()这两个有什么区别阿??我真得都翻遍了书,请哪位直接告诉我
铖邑 2006-04-30
  • 打赏
  • 举报
回复
晕,参数里面的const不要去掉
clouddeng 2006-04-30
  • 打赏
  • 举报
回复
那具体来说应该怎么改呢??我把Polynomial::Polynomial(const Polynomial&) 里面的const去掉,这部分的报错就没了,可是后面的bool Polynomial::operator==(const Polynomial& right)里面的const是不能丢的阿。这部分的报错还是在
glchen57 2006-04-30
  • 打赏
  • 举报
回复
你应该象这样 int degree() const;
返回内部类型int就不要再弄个const int degree()了,前面那个const多余
还有你的头文件用个using namespace std;不好吧?用了std也不好混用那些有.h的头文件把?
铖邑 2006-04-30
  • 打赏
  • 举报
回复
楼主写错了,应该是int degree() const;
sharpdew 2006-04-30
  • 打赏
  • 举报
回复
不是degree的,是Polynomial::Polynomial(const Polynomial&)
sharpdew 2006-04-30
  • 打赏
  • 举报
回复
const去掉

64,676

社区成员

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

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