c++ class重载比较运算符的写法

本地能编译通过,但是在一个脑残oj上RE了。。不知道是不是哪里写的不规范

/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function ‘const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&) [with _Tp = S]’:
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2642:   instantiated from ‘void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) [with _RandomAccessIterator = S*, _Size = int]’
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2713:   instantiated from ‘void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = S*]’
/main.cxx:34:   instantiated from here
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:91: error: passing ‘const S’ as ‘this’ argument of ‘bool S::operator<(const S&)’ discards qualifiers
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:92: error: passing ‘const S’ as ‘this’ argument of ‘bool S::operator<(const S&)’ discards qualifiers
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:94: error: passing ‘const S’ as ‘this’ argument of ‘bool S::operator<(const S&)’ discards qualifiers
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:98: error: passing ‘const S’ as ‘this’ argument of ‘bool S::operator<(const S&)’ discards qualifiers
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:100: error: passing ‘const S’ as ‘this’ argument of ‘bool S::operator<(const S&)’ discards qualifiers

以上是错误提示。。

class S{
    public:
        int l,r;
        S* nxt;
        S(int x,int y){
            l=x;
            r=y;
            nxt=NULL;
        }
        S(){
            l=0; r=0; nxt=NULL;
        }
        int con(){
            if(nxt->l<=r) return 1;
            else return 0;
        }
        bool operator <(const S& next){
            if(l<next.l) return 1;
            else return 0;
        }
};

后面用到了sort

    sort(seg+1,seg+n+1);
c++

2个回答

把operator <的参数中的const去掉,有可能是常引用的问题

bool operator <(const S& next) const{
if(l<next.l) return 1;
else return 0;
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c++ class重载比较运算符的写法

本地能编译通过,但是在一个脑残oj上RE了。。不知道是不是哪里写的不规范 ``` /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function ‘const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&) [with _Tp = S]’: /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2642: instantiated from ‘void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) [with _RandomAccessIterator = S*, _Size = int]’ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2713: instantiated from ‘void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = S*]’ /main.cxx:34: instantiated from here /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:91: error: passing ‘const S’ as ‘this’ argument of ‘bool S::operator<(const S&)’ discards qualifiers /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:92: error: passing ‘const S’ as ‘this’ argument of ‘bool S::operator<(const S&)’ discards qualifiers /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:94: error: passing ‘const S’ as ‘this’ argument of ‘bool S::operator<(const S&)’ discards qualifiers /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:98: error: passing ‘const S’ as ‘this’ argument of ‘bool S::operator<(const S&)’ discards qualifiers /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:100: error: passing ‘const S’ as ‘this’ argument of ‘bool S::operator<(const S&)’ discards qualifiers ``` 以上是错误提示。。 ```c++ class S{ public: int l,r; S* nxt; S(int x,int y){ l=x; r=y; nxt=NULL; } S(){ l=0; r=0; nxt=NULL; } int con(){ if(nxt->l<=r) return 1; else return 0; } bool operator <(const S& next){ if(l<next.l) return 1; else return 0; } }; ``` 后面用到了sort ```c++ sort(seg+1,seg+n+1); ```

operator new是普通函数还是重载new运算符的函数

1、如果operator new是重载new运算符,那为什么new关键字可以正常使用,如 class A{}; A *p = new A; //为何不是调用operator new函数而是new关键字,我试过重载函数void *operator new(A)但是函数编译会报错,提示第一个参数要是size_t类型 还有int *p=(int *)new(sizeof(int));同样会报错 2、如果operator new只是单纯的是一个库函数而不是重载,那为什么该函数名中 间可以用空格

C++重载运算符加减乘除。

C++如何用class重载+号实现(a,b)+(c,d)=(a+c,b+d)。

c++运算符重载即++运算符重载的问题

``` class Triangular_iterator { public: Triangular_iterator( int index ) : _index( index-1 ){} //*** bool operator==( const Triangular_iterator& ) const; bool operator!=( const Triangular_iterator& ) const; int operator*() const; Triangular_iterator& operator++(); // prefix version Triangular_iterator operator++( int ); // postfix version private: void check_integrity() const; int _index; }; operator++() //前置版本 { // prefix instance ++_index; check_integrity(); return *this; } inline Triangular_iterator Triangular_iterator:: operator++( int ) //后置版本 { // postfix instance Triangular_iterator tmp = *this; ++_index; check_integrity(); return tmp; } ``` 我的问题: 1.后置版本的++运算为什么要返回一个临时对象? 2.后置版本是否是新建了一个Triangular_iterator并将运算符的调用对象复制,那么为什么没有重载=运算符就能运算成功? 3.后置版本中的++_index到底是哪个对象的_index,是tmp的还是this的,最后返回的临时对象中的_index+1了吗?

运算符重载的UML图怎么画 帮忙画一下 感谢

#include <iostream.h> class Complex //复数类 { double real; double image ; public : Complex (double x=0.0,double y=0.0) { real=x; image=y; } ~Complex() // 析构函数 { cout<<"("<<real<<","<<image<<")被析构"<<endl; } Complex (const Complex &com1);//拷贝构造函数 void print (); friend Complex operator +(const Complex &c1,const Complex &c2); //声明友元函数 friend Complex operator -(const Complex &c1,const Complex &c2); friend Complex operator *(const Complex &c1,const Complex &c2); friend Complex operator /(const Complex &c1,const Complex &c2); friend Complex operator -(const Complex &c1); //数值取反 friend ostream &operator<<( ostream &os,const Complex &c1); //重载运算符<< }; Complex::Complex (const Complex &com1) //定义拷贝构造函数 { real=com1.real ;image=com1.image ; cout<<"Copy"<<endl; } Complex fun (Complex com2) { Complex com3(com2); return com3; } void Complex ::print () //输出函数 { if (!real) { cout<<image<<"i"<<endl; } else { if (image<0) cout<<real<<image<<"i"<<endl; else cout<<real<<"+"<<image<<"i"<<endl; } } Complex operator +(const Complex &c1,const Complex &c2) //定义友元函数 加法 { Complex temp(c1.real +c2.real ,c1.image +c2.image ); return temp; } Complex operator -(const Complex &c1,const Complex &c2) //减法 { Complex temp(c1.real -c2.real ,c1.image -c2.image ); return temp; } Complex operator *(const Complex &c1,const Complex &c2) //乘法 { Complex temp (c1.real *c2.real -c1.image *c2.image,c1.real *c2.image+c1.image *c2.real); return temp; } Complex operator /(const Complex &c1,const Complex &c2) //除法 { Complex temp ((c1.real *c2.real +c1.image *c2.image)/(c2.real *c2.real+c2.image+c2.image),(c1.real *c2.image-c1.image *c2.real)/(c2.real *c2.real+c2.image+c2.image)); return temp; } Complex operator -(const Complex &c1) //取反 { Complex temp(-c1.real ,-c1.image ); return temp; } ostream &operator<<( ostream &cout,const Complex &c1) //重载<<运算符 { cout<<"("<<c1.real <<","<<c1.image <<")"<<endl; return cout; } int main() { Complex c1(1,1),c2(2,2),c3,c4,c5,c6,c7,co1; c3=c1+c2; c3.print (); c4=c2-c1; c4.print (); c5=c1*c2; c5.print (); c6=c2/c1; c6.print (); c7=-c1; c7.print (); co1=c1; co1=fun(c1); co1.print (); cout<<c1; return 0; }

c++重载二维数组运算符,即两个括号

小弟不才,今天上午才明白重载[]的一维用法,但又卡在了二维数组时的重载 我的思路就是 在该类中, class array(int a,int b){*p=new int[a*b];} int & operator [] (int n) {return 这里不知道该怎么搞,这个二维数组当一维数组处理的指针,两次调用的处理方法好像不一样,也无法进行条件判断} private: int **p; 这里就尴尬了,*p是指向指针p的指针,p是指向动态内存首地址的指针。说实话我个人不太理解这种写法,混在一起难理解,又搅不清。这是我网上搜到的思路,个人理解能力有限,希望大神们指点指点。 这里就是想问下,重载二维数组的下标运算符,有什么思路没,初学者能理解的那种…,顺便问下重载圆括号函数调用运算符的思路,圆括号的重载目前完全没思路。如果有大神愿意贴出部分关键源代码,在此再次感谢了

c++重载运算符的问题 ...

今天学习了 重载运算符, 有一个重载[]的疑问 class A { public: A(int n) { m_num = n; } int& getNum() { return m_num; } private: int m_num; }; int &operator[](A &a,int index) { cout << "index:" << index << endl; return a.getNum(); } 为什么重载运算符[]函数无法写成全局的 但++ -- 或者其他运算符都可以写在全局呢

类模版对运算符重载以及输入输出重载

#include<iostream.h> //using namespace std; template <class T> class Complex { public: friend istream& operator >> (istream &input,Complex &<T>c) { cin >> c.real >> c.imag; return input; } friend ostream& operator << (ostream &output,Complex &<T>c) { cout << "(" << c.real << "+" << c.imag << "i)" << endl; return output; } //friend istream & operator >> (istream &input,Complex &); //friend ostream & operator << (ostream &output,Complex &); Complex(T r,T i) { real = r; imag = i; } Complex(){} Complex operator + (Complex &c2) { return Complex(real + c2.real,imag + c2.imag); } Complex operator * (Complex &c2) { return Complex(real * c2.real,imag * c2.imag); } Complex operator % (Complex &c2) { return Complex(real % c2.real,imag % c2.imag); } Complex operator - (Complex &c2) { return Complex(real - c2.real,imag - c2.imag); } private: T real,imag; }; //template<class T> int main() { Complex<float>c1,c2,c3; cout << "请输入第一个对象的实部和虚部" << endl; cin >> c1; cout << "请输入第一个对象的实部和虚部" << endl; cin >> c2; c3 = c1 + c2; cout << c3; c3 = c1 - c2; cout << c3; c3 = c1 * c2; cout << c3; c3 = c1 % c2; cout << c3; return 0; }

重载运算符的问题,如何实现int + (某类对象)

#include <iostream> using namespace std; template<typename T> class BigNumber { T n; public: BigNumber(T i) :n(i) {} BigNumber operator+(BigNumber b) { return BigNumber(n + b.n); } }; int main() { BigNumber<int> b1(1), b2(2); 3 + 3; b1 + 3; 3+b1;//这是错的,如何改成对的 b1 + b2; return 0; }

范磊c++,在十八章写String类 “重载输入运算符” 遇到问题,请各位大侠帮忙指点!

#include <iostream> using namespace std; class String { public: String(); String(char*); String(String&); virtual ~String(){cout<<"析构函数执行\n";delete []str;len=0;} const int getlen()const{return len;} friend ostream& operator<<(ostream&o,String &s) { o<<s.str; return o; } friend istream& operator>>(istream&i,String &s) { i>>s.str; return i; } char &operator[](unsigned short int); String & operator=(String&); String & operator=(char *); private: int len; char *str; }; String::String() { cout<<"不带参数的构造函数执行\n"; len=0; str=new char[1]; str[0]='\0'; } String::String(char*ch) { cout<<"带一个参数的构造函数执行\n"; len=strlen(ch); str=new char[len+1]; for (int i=0;i<len;i++) { str[i]=ch[i]; } str[len]='\0'; } String::String(String&s) { cout<<"复制构造函数执行\n"; len=s.getlen(); str=new char[len+1]; for (int i=0;i<len;i++) { str[i]=s.str[i]; } str[len]='\0'; } char &String::operator[](unsigned short int length) { cout<<"operator[]函数执行\n"; if (len<length) { return str[len-1]; } return str[length]; } String & String::operator=(String&s) { cout<<"operator=函数执行\n"; delete []str; len=s.getlen(); str=new char[len+1]; for (int i=0;i<len;i++) { str[i]=s.str[i]; } str[len]='\0'; return *this; } String & String::operator=(char*ch) { cout<<"operator=char函数执行\n"; delete []str; len=strlen(ch); str=new char[len+1]; for (int i=0;i<len;i++) { str[i]=ch[i]; } str[len]='\0'; return *this; } int main() **strong text** { String s; cin>>s; cout<<s<<endl; cout<<s.getlen()<<endl; return 0; } 运行到结尾的时候,输出了我输入的字符,然后输出s.getlen(字符长度)的时候并不是我输入的字符长度,并且程序运行到这里后就崩溃了,当删除掉析构函数里的delete []str以后程序就不会崩溃了,请问是什么原因呢?

C++运算符重载的问题...

``` class Integer { private: int data; public: Integer(int a):data(a){} Integer operator-(Integer &another) { Integer tmp(0); tmp.data= this->data-another.data; return tmp; } void show() { cout<<data<<endl; } }; ``` tmp= this->data-another.data;这样不写成tmp.data编译器也没报错,执行结果也正确,C++是会自动匹配吗

C++重载运算符“<<”和“>>”出现错误

主函数中用<<>时 出现错误 no operator defined which takes a right-hand operand of type 'class vsctor' (or there is no acceptable conversion) #include<iostream> using namespace std; class vsctor { public: vsctor(int z1=0,int z2=0,int z3=0); void set(int z1,int z2,int z3); void get(int& a,int& b,int& c) const; //ostream& operator<<(ostream& os,const vsctor& v); //istream& operator>>(istream& is,vsctor& v); private: int a,b,c; }; main() { int z1,z2,z3,x1,x2,x3,y1,y2,y3; vsctor v1(1,1,1); vsctor v2(2,2,2); cout<<v1<<v2; vsctor v; cin>>v; cout<<v; } vsctor::vsctor(int z1,int z2,int z3):a(z1),b(z2),c(z3) {} void vsctor::set(int x1,int x2,int x3) { a=x1;b=x2;c=x3; } void vsctor::get(int& z1,int& z2,int& z3) const { z1=a;z2=b;z3=c; } ostream& operator<<(ostream& os,const vsctor& v) { int z1,z2,z3; v.get( z1,z2,z3); os<<"("<<z1<<","<<z2<<","<<z3<<")"<<endl; return os; } istream& operator>>(istream& is,vsctor& v) { int z1,z2,z3; is>>z1>>z2>>z3; v.set(z1,z2,z3); return is; }

C++ list赋值和类的运算符重载

刚刚发现了个问题,一直卡着我 class CA { public: CA(){} ~CA(){} public: VOID operator = ( CA& msg ) { dwvalue = msg.dwvalue; } private: DWORD dwvalue; }; VOID Fuck1( OUT list<CA>& bb ) { list< CA > aa; CA a; CA b; aa.push_back(a); aa.push_back(b); // list< CA > cc = aa; bb = aa; } VOID RegisteFunction( VOID ) { list< CA > bb; Fuck1( bb ); return; } 我要是以上面的写法 是编译不过的, 有两种方法,第一种 :把 fuck1中的bb=aa去掉,改成list< CA > cc = aa;这种写法,就可以编译通过, 第二种,把类的运算符重载改成operator = ( CA* msg ),也是可以编译通过的 当然 还可以把重载运算符去掉。。。但是 我其实是想做一个list的赋值操作,而且那个类是定义好的,里面需要有个重载运算符的操作, 所以我想问问: 1、 list< CA > cc = aa方式和先声明一个list<CA> cc; 再做 cc=aa;的操作有什么区别? 2、运算符重载上我看都是用的引用,指针的写法可以吗?有什么区别?

在定义重载赋值运算符时,为什么要用应用做返回值。

class string { char *m_str; public: string(char *s) { m_str=s; } string() {}; String & operator=(const string s) // 这里!!!返回值为啥是引用 { m_str=s.m_str; return *this }// 返回*this不是会调用析构函数的吗! }; int main() { string s1("abc"),s2; s2=s1; cout<<s2.m_str; }

C++重载的运算符不能一起调用吗

#include <iostream> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ using namespace std; class Counter{ private: int count; public: Counter(int i=0):count(i){} Counter operator +(Counter&c)const{return Counter(count+c.count);} Counter operator -(Counter&c)const{return Counter(count-c.count);} Counter operator ++(){return Counter(++count);} Counter operator ++(int){Counter c(*this);++(*this);return c;} friend ostream&operator <<(ostream&out,Counter&c); }; int main(int argc, char** argv) { Counter c1(1),c2(2),c3(3),temp; cout<<c1<<endl; temp=(c1+c2); cout<<temp<<endl; temp=(c3-c1); cout<<temp<<endl; temp=(c3++)+c3+c3; cout<<(c3++)<<endl;//重载了<<和++,这里为什么不能直接调用呢 cout<<c3<<endl; temp=(++c1); cout<<temp<<endl; return 0; } ostream&operator <<(ostream&out,Counter&c){ out<<"The value of the counter:"<<c.count; return out; };

关于运算符+重载的时候出现错误

#include <iostream> #include <conio.h> using namespace std; // enum bool {false,true}; struct element { //定义链表中的结点结构 int val; element *next; }; class list { //定义链表类 protected:element *elems; public: list() { elems = 0; } ~list(); virtual bool insert(int); //此虚函数在派生类中可重新定义 virtual bool deletes(int); //此虚函数在派生类中可重新定义 bool contain(int); void print(); }; class set :public list { //将集合类 set 定义为链表类 list 的派生类 int Card; public: set() { Card = 0; } bool insert(int); //重定义此函数 bool deletes(int); //重定义此函数 bool add(set*, set*); bool and(set*, set*); bool minute(set*, set*); friend set operator +(set&, set&); friend set operator -(set&, set&); friend set operator *(set&, set&); }; list::~list() //list 类得析构函数定义,循环释放各元素所占的存储 { element *tmp = elems; for (element *elem = elems; elem != 0;) { tmp = elem; elem = elem->next; delete tmp; } } bool list::insert(int val) //定义 list 类中插入元素的成员函数 { element *elem = new element; //为新元素分配存储 if (elem != 0) { elem->val = val; //将新元素插入到链表头 elem->next = elems; elems = elem; return true; } else return false; } bool list::deletes(int val) //定义 list 类中删除元素的成员函数 { if (elems == 0) return false; //若表为空,返回 false element *tmp = elems; if (elems->val == val) { //若待删除的元素为表头元素 elems = elems->next; delete tmp; return true; } else for (element *elem = elems; elem->next != 0; elem = elem->next) if (elem->next->val == val) { //循环查找待删除元素 tmp = elem->next; elem->next = tmp->next; delete tmp; return true; } return false; } bool list::contain(int val) { //判元素 val 在链表中是否存在,存在返回true,不存在返回false if (elems == 0)return false; if (elems->val == val) return true; else for (element *elem = elems; elem->next != 0; elem = elem->next) if (elem->next->val == val) return true; return false; } void list::print() //输出链表中各元素 { if (elems == 0) return; for (element *elem = elems; elem != 0; elem = elem->next) cout << elem->val << " "; cout << endl; } bool set::insert(int val) //在 set 类中的 insert 的重定义版本 { if (!contain(val)) { //先判断此元素是否存在,然后再调用基类的此函数版本 ++Card; list::insert(val); return true; } return false; } bool set::deletes(int val) //在 set 类中的 deletes 的重定义版本 { if (list::deletes(val)) //调用基类中的此函数版本 { return true; } return false; } bool set::add(set* s1,set* s2) { for (element* elem=s1->elems;elem!=NULL;elem=elem->next) { insert(elem->val); } for (element* elem = s2->elems; elem != NULL; elem = elem->next) { insert(elem->val); } return true; } bool set:: and (set* s1,set* s2) { for (element* elem=s1->elems;elem!=NULL;elem=elem->next) { if (s2->contain(elem->val)) { insert(elem->val); } } return true; } bool set::minute(set* s1,set* s2) { for (element* elem = s1->elems; elem!= NULL; elem = elem->next) { if (!s2->contain(elem->val)) { insert(elem->val); } } return true; } set operator +(set& s1, set& s2) { set s; for (element* elem = s1.elems; elem != NULL; elem = elem->next) { s.insert(elem->val); } for (element* elem = s2.elems; elem != NULL; elem = elem->next) { s.insert(elem->val); } return s; } set operator -(set& s1, set& s2) { set s; set* set1 = &s1; set* set2 = &s2; for (element* elem = set1->elems; elem != NULL; elem = elem->next) { if (!set2->contain(elem->val)) { s.insert(elem->val); } } return s; } set operator *(set& s1, set& s2) { set s; for (element* elem = s1.elems; elem != NULL; elem = elem->next) { if (s2.contain(elem->val)) { s.insert(elem->val); } } return s; } int main() { set *ptr, set1,set2; ptr = &set1; ptr->insert(15); ptr->insert(16); ptr->insert(17); ptr->insert(18); ptr->print(); ptr = &set2; ptr->insert(20); ptr->insert(19); ptr->insert(17); ptr->insert(18); ptr->print(); set set3, set4, set5; ptr = &set3; set3 = (set1 + set2); //set4 = set1 - set2; //set5 = set1 * set2; ptr->print(); ptr->print(); ptr->print(); return 1; }

有没有大神告诉我一下一个Definition类重载=运算符 函数类型后加&是什么意思

![图片说明](https://img-ask.csdn.net/upload/201811/12/1542031383_525567.png)

运算符重载<<,输出格式的问题

如图![图片](https://img-ask.csdn.net/upload/201705/13/1494610869_419965.png)

重载运算符类型不匹配

#ifndef DAT_H_INCLUDED #define DAT_H_INCLUDED #include<istream> #include<ostream> #include<iostream> using namespace std; class date { private: int year; int month; int day; int dton(date &a); //将指定日期转换成从0年O月O日起的天数 date ntod(int b); //将指定的0年O月O日起的天数转换成对应的日期 bool leap(int year); public: date(); date(int y,int m,int d); friend istream &operator >> (istream &is,date &d); friend ostream &operator << (ostream &os,date &d); date operator +(int &days); date operator -(int &days); int operator -(date &da); void operator =(date &da); int dt(date &a); date nt(int b); bool le(int year); ~date(); }; #endif // DAT_H_INCLUDED ``` #include"dat.h" #include<istream> #include<ostream> #include<iostream> using namespace std; static int day_tab[2][12] = {{31,28,31,30,3l,30,3l,3l,30,31,30,31}, {31,29,31,30,31,30,31,31,30,31,30,31}}; date::date() { year = 0; month = 1; day = 1; } date::date(int y,int m,int d) { year = y; month = m; day = d; } istream &operator >> (istream &is,date &d) { cin >> d.year >> d.month >> d.day; return is; } ostream &operator << (ostream &os,date &d) { cout << d.year << "." << d.month << "." << d.day << endl; return os; } bool date::leap(int year) { if((year % 4 == 0 && year % 100 != 0)||year % 400 == 0) return true; else return false; } date date::operator +(int &days) { int rest; rest = this->dt(*this) + days; return this->nt(rest); } int date::dton(date &a) { int ye,mo,da=0; for(ye = 0;ye < a.year;ye++) { if(a.le(a.year)) da += 366; else da += 365; } for(mo = 0;mo < a.month-1;mo++) { if(a.le(a.year)) da += day_tab[0][mo]; else da += day_tab[1][mo]; } da += a.day; return da; } date date::ntod(int b) { date a(0,1,1); int rest = b; while(1) { if(a.le(a.year)) { rest -= 366; if(rest < 0) { rest += 366; break; } a.year++; } else { rest -= 365; if(rest < 0) { rest += 365; break; } a.year++; } } while(1) { if(a.le(a.year)) { for(int i = 0;i < 12;i++) { rest -= day_tab[0][i]; if(rest < 0) { rest += day_tab[0][i]; break; } a.month++; } } else { for(int i = 0;i < 12;i++) { rest -= day_tab[1][i]; if(rest < 0) { rest += day_tab[1][i]; break; } a.month++; } } break; } a.day = rest; return a; } date date::operator -(int &days) { int da; da = this->dt(*this) - days; return this->nt(da); } int date::operator -(date &da) { int rest; rest = this->dt(*this) - da.dt(da); return rest; } int date::dt(date &a) { return dton(a); } date date::nt(int b) { return ntod(b); } bool date::le(int year) { return leap(year); } void date::operator =(date &da) { this->year = da.year; this->month = da.month; this->day = da.day; } date::~date() { } #include<iostream> #include<ostream> #include<windows.h> #include"dat.h" using namespace std; int main() { while(1) { date *p = new date; cout << "请输入日期:" << endl; cin >> *p; int n; cout << "请选择功能:" << endl; cout << "1.将日期转化为天数\n" << "2.两日期相差天数\n" << "3.计算所加天数后日期\n" << "4.计算所减天数后日期\n" << "5.将天数转化为日期\n" << "6.退出" << endl; cin >> n; while(n<1||n>6) { cout << "输入错误,请重新选择功能" << endl; n = 0; cin >> n; } system("cls"); switch(n) { case 1: { cout << p->dt(*p) << endl; system("pause"); system("cls"); break; } case 2: { date *q = new date; cout << "请输入日期:" << endl; cin >> *q; cout << *p - *q << endl; system("pause"); system("cls"); delete q; break; } case 3: { cout << "请输入天数:" << endl; int m; cin >> m; cout << *p + m << endl; system("pause"); system("cls"); break; } case 4: { cout << "请输入天数:" << endl; int k; cin >> k; cout << (*p - k) << endl; system("pause"); system("cls"); break; } case 5: { cout << "请输入天数:" << endl; int u; cin >> u; date q = p->nt(u); cout << q << endl; system("pause"); system("cls"); break; } case 6:exit(0); } } } 报错: ||=== Build: Debug in Date (compiler: GNU GCC Compiler) ===| D:\C++学习\Date\main.cpp||In function 'int main()':| D:\C++学习\Date\main.cpp|65|error: no match for 'operator<<' in 'std::cout << date::operator-(const int&)(((const int&)((const int*)(& k))))'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\ostream|108|note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\ostream|117|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\ostream|127|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\ostream|165|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\ostream|169|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\ostream|173|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\ostream.tcc|91|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\ostream|180|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\ostream.tcc|105|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\ostream|191|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\ostream|200|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>]| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\ostream|204|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\ostream|209|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>]| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\ostream|213|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>]| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\ostream|221|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>]| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\ostream|225|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits<char>]| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\ostream.tcc|119|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>]| D:\C++学习\Date\dat.h|21|note: std::ostream& operator<<(std::ostream&, date&)| ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

为什么重载后置递增运算符用左移运算符重载输出时左移运算符重载函数形参不能用引用?

```cpp #include <iostream> #include <string> using namespace std; class person { friend ostream& operator<<(ostream &cout,person p); private: int m_a; int m_b; public: person(int a,int b) { m_a=a; m_b=b; } //重载后置++运算符 person operator++(int) { person temp=*this; m_a++; m_b++; return temp; } }; //全局函数重载左移运算符 ostream& operator<<(ostream &out,person p) //???不能用引用&p { out<<"m_a="<<p.m_a<<" m_b="<<p.m_b; return out; } void test() { person pp(0,0); cout<<pp<<endl; cout<<pp++<<endl; } int main() { test(); system ("pause"); return 0; } ``` 如果在全局函数重载那儿加了引用,即: ```cpp friend ostream& operator<<(ostream &cout,person &p); ``` 和 ```cpp ostream& operator<<(ostream &out,person &p) ``` 会报错,如下: { "owner": "C/C++", "severity": 8, "message": "没有与这些操作数匹配的 \"<<\" 运算符 -- 操作数类型为: std::ostream << person", "startLineNumber": 36, "startColumn": 9, "endLineNumber": 36, "endColumn": 9 } 但是不加引用可以正常运行。为什么????

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

CSDN:因博主近期注重写专栏文章(已超过150篇),订阅博主专栏人数在突增,近期很有可能提高专栏价格(已订阅的不受影响),提前声明,敬请理解!

CSDN:因博主近期注重写专栏文章(已超过150篇),订阅博主专栏人数在突增,近期很有可能提高专栏价格(已订阅的不受影响),提前声明,敬请理解! 目录 博客声明 大数据了解博主粉丝 博主的粉丝群体画像 粉丝群体性别比例、年龄分布 粉丝群体学历分布、职业分布、行业分布 国内、国外粉丝群体地域分布 博主的近期访问每日增量、粉丝每日增量 博客声明 因近期博主写专栏的文章越来越多,也越来越精细,逐步优化文章。因此,最近一段时间,订阅博主专栏的人数增长也非常快,并且专栏价

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

培训班出来的人后来都怎么样了?(二)

接着上回说,培训班学习生涯结束了。后面每天就是无休止的背面试题,不是没有头脑的背,培训公司还是有方法的,现在回想当时背的面试题好像都用上了,也被问到了。回头找找面试题,当时都是打印下来天天看,天天背。 不理解呢也要背,面试造飞机,上班拧螺丝。班里的同学开始四处投简历面试了,很快就有面试成功的,刚开始一个,然后越来越多。不知道是什么原因,尝到胜利果实的童鞋,不满足于自己通过的公司,嫌薪水要少了,选择...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

工作八年,月薪60K,裸辞两个月,投简历投到怀疑人生!

近日,有网友在某职场社交平台吐槽,自己裸辞两个月了,但是找工作却让自己的心态都要崩溃了,全部无果,不是已查看无回音,就是已查看不符合。 “工作八年,两年一跳,裸辞两个月了,之前月薪60K,最近找工作找的心态崩了!所有招聘工具都用了,全部无果,不是已查看无回音,就是已查看不符合。进头条,滴滴之类的大厂很难吗???!!!投简历投的开始怀疑人生了!希望 可以收到大厂offer” 先来看看网...

97年世界黑客编程大赛冠军作品(大小仅为16KB),惊艳世界的编程巨作

这是世界编程大赛第一名作品(97年Mekka ’97 4K Intro比赛)汇编语言所写。 整个文件只有4095个字节, 大小仅仅为16KB! 不仅实现了3D动画的效果!还有一段震撼人心的背景音乐!!! 内容无法以言语形容,实在太强大! 下面是代码,具体操作看最后! @echo off more +1 %~s0|debug e100 33 f6 bf 0 20 b5 10 f3 a5...

不要再到处使用 === 了

我们知道现在的开发人员都使用 === 来代替 ==,为什么呢?我在网上看到的大多数教程都认为,要预测 JavaScript 强制转换是如何工作这太复杂了,因此建议总是使用===。这些都...

什么是a站、b站、c站、d站、e站、f站、g站、h站、i站、j站、k站、l站、m站、n站?00后的世界我不懂!

A站 AcFun弹幕视频网,简称“A站”,成立于2007年6月,取意于Anime Comic Fun,是中国大陆第一家弹幕视频网站。A站以视频为载体,逐步发展出基于原生内容二次创作的完整生态,拥有高质量互动弹幕,是中国弹幕文化的发源地;拥有大量超粘性的用户群体,产生输出了金坷垃、鬼畜全明星、我的滑板鞋、小苹果等大量网络流行文化,也是中国二次元文化的发源地。 B站 全称“哔哩哔哩(bilibili...

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

MySQL性能优化(五):为什么查询速度这么慢

前期回顾: MySQL性能优化(一):MySQL架构与核心问题 MySQL性能优化(二):选择优化的数据类型 MySQL性能优化(三):深入理解索引的这点事 MySQL性能优化(四):如何高效正确的使用索引 前面章节我们介绍了如何选择优化的数据类型、如何高效的使用索引,这些对于高性能的MySQL来说是必不可少的。但这些还完全不够,还需要合理的设计查询。如果查询写的很糟糕,即使表结构再合理、索引再...

用了这个 IDE 插件,5分钟解决前后端联调!

点击上方蓝色“程序猿DD”,选择“设为星标”回复“资源”获取独家整理的学习资料!作者 |李海庆我是一个 Web 开发前端工程师,受到疫情影响,今天是我在家办公的第78天。开发了两周,...

大厂的 404 页面都长啥样?最后一个笑了...

每天浏览各大网站,难免会碰到404页面啊。你注意过404页面么?猿妹搜罗来了下面这些知名网站的404页面,以供大家欣赏,看看哪个网站更有创意: 正在上传…重新上传取消 腾讯 正在上传…重新上传取消 网易 淘宝 百度 新浪微博 正在上传…重新上传取消 新浪 京东 优酷 腾讯视频 搜...

【高并发】高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!

网上很多的文章和帖子中在介绍秒杀系统时,说是在下单时使用异步削峰来进行一些限流操作,那都是在扯淡! 因为下单操作在整个秒杀系统的流程中属于比较靠后的操作了,限流操作一定要前置处理,在秒杀业务后面的流程中做限流操作是没啥卵用的。

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

代码注释如此沙雕,会玩还是你们程序员!

某站后端代码被“开源”,同时刷遍全网的,还有代码里的那些神注释。 我们这才知道,原来程序员个个都是段子手;这么多年来,我们也走过了他们的无数套路… 首先,产品经理,是永远永远吐槽不完的!网友的评论也非常扎心,说看这些代码就像在阅读程序员的日记,每一页都写满了对产品经理的恨。 然后,也要发出直击灵魂的质问:你是尊贵的付费大会员吗? 这不禁让人想起之前某音乐app的穷逼Vip,果然,穷逼在哪里都是...

Java14 新特性解读

Java14 已于 2020 年 3 月 17 号发布,官方特性解读在这里:https://openjdk.java.net/projects/jdk/14/以下是个人对于特性的中文式...

爬虫(101)爬点重口味的

小弟最近在学校无聊的很哪,浏览网页突然看到一张图片,都快流鼻血。。。然后小弟冥思苦想,得干一点有趣的事情python 爬虫库安装https://s.taobao.com/api?_ks...

疫情后北上广深租房价格跌了吗? | Alfred数据室

去年3月份我们发布了《北上广深租房图鉴》(点击阅读),细数了北上广深租房的各种因素对租房价格的影响。一年过去了,在面临新冠疫情的后续影响、城市尚未完全恢复正常运转、学校还没开学等情况下...

面试官给我挖坑:a[i][j] 和 a[j][i] 有什么区别?

点击上方“朱小厮的博客”,选择“设为星标”后台回复&#34;1024&#34;领取公众号专属资料本文以一个简单的程序开头——数组赋值:int LEN = 10000; int[][] ...

又一起程序员被抓事件

就在昨天互联网又发生一起让人心酸的程序员犯罪事件,著名的百度不限速下载软件 Pandownload PC 版作者被警方抓获。案件大致是这样的:软件的作者不仅非法盗取用户数据,还在QQ群进...

应聘3万的职位,有必要这么刁难我么。。。沙雕。。。

又一次被面试官带到坑里面了。面试官:springmvc用过么?我:用过啊,经常用呢面试官:springmvc中为什么需要用父子容器?我:嗯。。。没听明白你说的什么。面试官:就是contr...

太狠了,疫情期间面试,一个问题砍了我5000!

疫情期间找工作确实有点难度,想拿到满意的薪资,确实要点实力啊!面试官:Spring中的@Value用过么,介绍一下我:@Value可以标注在字段上面,可以将外部配置文件中的数据,比如可以...

Intellij IDEA 美化指南

经常有人问我,你的 IDEA 配色哪里搞的,我会告诉他我自己改的。作为生产力工具,不但要顺手而且更要顺眼。这样才能快乐编码,甚至降低 BUG 率。上次分享了一些 IDEA 有用的插件,反...

【相亲】96年程序员小哥第一次相亲,还没开始就结束了

颜值有点高,条件有点好

太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

一图看完本文 一、 计算机网络体系结构分层 计算机网络体系结构分层 计算机网络体系结构分层 不难看出,TCP/IP 与 OSI 在分层模块上稍有区别。OSI 参考模型注重“通信协议必要的功能是什么”,而 TCP/IP 则更强调“在计算机上实现协议应该开发哪种程序”。 二、 TCP/IP 基础 1. TCP/IP 的具体含义 从字面意义上讲,有人可能会认为...

腾讯面试题: 百度搜索为什么那么快?

我还记得去年面腾讯时,面试官最后一个问题是:百度/google的搜索为什么那么快? 这个问题我懵了,我从来没想过,搜素引擎的原理是什么 然后我回答:百度爬取了各个网站的信息,然后进行排序,当输入关键词的时候进行文档比对……巴拉巴拉 面试官:这不是我想要的答案 我内心 这个问题我一直耿耿于怀,终于今天,我把他写出来,以后再问,我直接把这篇文章甩给他!!! 两个字:倒排,将贯穿整篇文章,也是面试官...

相关热词 c# 解析cad c#数字格式化万 c#int转byte c#格式化日期 c# wpf 表格 c# 实现ad域验证登录 c#心跳包机制 c#使用fmod.dll c#dll vb 调用 c# outlook
立即提问
相关内容推荐