C++实现一个简单student类和重载运算符

   在学习了C++后,感觉到其面向对象的思想与 C 的面向程序的不同之处。在对象内部定义对其的操作,只提供接口供用户使用,其操作对用户隐藏。所以我也仿写了一个简单的类及几个运算符的重载。

但是还存在一个问题,我一直也没解决,就是我的几个重载运算符想要写成内联函数,但是由于参数问题,我只会写成友元了。望大神可以指点一二。

上代码吧

#include<stdio.h>
#include<iostream>
#include<string>
#include<cassert>
using namespace std;
class Student {
public:
    //几种构造函数
    Student() = default;
    Student(const string &s) : nameNo(s) { }
    Student(const string &s, int chi, int ma) :
        nameNo(s), chinese(chi), math(ma), sumgrade (chi + ma) { }
    Student(const Student&);       //拷贝构造函数
    
    string name() const {return nameNo;}
    int grade() const {return sumgrade;}    //返回总分
    double avg_grade() const;     //求平均值
    
    //几种重载运算符
    Student& operator +=(const Student&);
    friend istream& operator >>(istream &is, Student &item);
    friend ostream& operator <<(ostream &os, Student &item);
    friend bool operator ==(const Student &lhs, const Student &rhs);
    friend bool operator !=(const Student &lhs, const Student &rhs);
    friend Student operator +(const Student &lhs, const Student &rhs);
    friend bool operator <(const Student &lhs, const Student &rhs);
    friend bool operator >(const Student &lhs, const Student &rhs);
    
    ~Student() = default;     //析构函数
    
private:
    string nameNo;      //姓名
    int chinese = 0;    //语文分数
    int math = 0;       //数学分数
    int sumgrade = 0;   //总分
};

Student::Student(const Student &item) :
    nameNo(item.nameNo),
    chinese(item.chinese),
    math(item.math),
    sumgrade(item.sumgrade)
    { }
    
double Student::avg_grade() const {
    if (sumgrade)
        return sumgrade / 2.0;
    else
        return 0;
}

Student& Student::operator +=(const Student &item) {
    chinese += item.chinese;
    math += item.math;
    sumgrade += item.sumgrade;
    return *this;
}

istream& operator >>(istream &is, Student &item) {
    is >> item.nameNo >> item.chinese >> item.math;
    if (is)
        item.sumgrade = item.chinese + item.math;
    else
        item = Student();
    return is;
}

ostream& operator <<(ostream &os, Student &item) {
    os << item.name() << " " <<  item.chinese << " "
        << item.math << " " << item.sumgrade;
    return os;
}

bool operator ==(const Student &lhs, const Student &rhs) {
    return lhs.name() == rhs.name();
}

bool operator !=(const Student &lhs, const Student &rhs) {
    return !(lhs == rhs);
}

Student operator +(const Student &lhs, const Student &rhs) {
    Student sum = lhs;
    sum += rhs;
    return sum;
}

bool operator <(const Student &lhs, const Student &rhs) {
    return lhs.sumgrade < rhs.sumgrade;
}  

bool operator >(const Student &lhs, const Student &rhs) {
    return lhs.sumgrade > rhs.sumgrade;
}

int main()
{
    string sa = "liang";
    Student temp(sa,20,30);
    assert(temp.name() == sa);      //#1 assert
    assert(temp.grade() == 50);     //#2 assert
    cout << "temp is :" << endl;
    cout <<  temp << endl;
    cout << "avg_grade = " << temp.avg_grade() << endl;
    cout << "temp.name is :" << temp.name() << endl;
    cout << "temp.grade = " << temp.grade() << endl;
    cout << endl;
    
    Student buff(temp);     //拷贝构造
    assert(buff.name() == sa);     //#3 assert
    assert(buff.grade() == 50);    //#4 assert
    cout << "buff is :" << endl;
    cout << buff << endl;
    cout << endl;
    
    Student M;
    assert(M.name() == "");     //#5 assert
    assert(M.grade() == 0);     //#6 assert
    cout << "M is " << M << endl;
    cout << endl;
    
    Student N("zhang");
    assert(N.name() == "zhang");    //#7 assert
    assert(N.grade() == 0);         //#8 assert
    cout << "N is " << N << endl;
    cout << endl;
    
    M = temp;
    assert(M.name() == sa);     //#9 assert
    assert(M.grade() == 50);    //#10 assert
    cout << "M is " << M << endl;
    cout << endl;
    
    Student Stu("liang",25,25);
    assert(Stu.name() == "liang");     //#11 assert
    assert(Stu.grade() == 50);       //#12 assert
    if (Stu == temp){
        Stu += temp;
        cout << "Stu is " << Stu << endl;
        cout << endl;
    }
    if (N != temp){
        cout << "student " << N.name() << " NOT " << temp.name() << endl;
        cout << endl;
    }
    
    Student A;
    assert(cin >> A);      //#13 assert
    cout << "A is " << A << endl;
    cout << endl;
    
    Student sum = temp + A;
    assert(sum.grade() == temp.grade() + A.grade());      //#14 assert
    cout << sum << endl;
    cout << endl;
    
    if (A < temp){
        cout << A.name() << " less than " << temp.name() << endl;
        cout << endl;
    }
    if (A > temp){
        cout << A.name() << " more than " << temp.name() << endl;
        cout << endl;
    }
    return 0;
}

运行结果如下,其中为测试重载输入运算符(>>), liu 10 15,由手动键盘输入

谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值