explicit关键字用法,类组合

单参数的构造函数可以发生从参数类型到类类型的隐式转换,例如:

Student doh("Homer",10);

doh = 5;

则程序会将int 5转换为Student(5),赋值给doh;

加上explicit会关闭这种转换;

#include <iostream>
#include <valarray>
#include <string>

using namespace std;

    typedef valarray<double> ArrayDb;
    typedef valarray<double> ArrayDb;
class Student
{
public:
    Student():name("Null Student"),scores(){}
    explicit Student(const string &s):name(s),scores(){}
    explicit Student(int n):name("Nully"),scores(n){}
    Student(const string &s,int n):name(s),scores(n){}
    Student(const string &s,const ArrayDb &a):name(s),scores(a){}
    Student(const char *str,const double *pd,int n):name(str),scores(pd,n){}
    ~Student(){}
    double Average() const;
    const string &Name() const;
    double& operator[](int i);
    double operator [] (int i) const ;

    //friends
    friend istream& operator>>(istream& is,Student &stu);
    friend istream& getline(istream& is,Student &stu);
    friend ostream& operator<<(ostream& os,const Student &stu);

private:
    typedef valarray<double> ArrayDb;
    string name;
    ArrayDb scores;
    ostream& arr_out(ostream &os) const;
};

double Student::Average () const
{
    if(scores.size () >0)
        return scores.sum ()/scores.size ();
    else
        return 0;
}

const string & Student::Name() const
{
    return name;
}

double &Student::operator [](int i)
{
    return scores[i];
}

double Student::operator [] (int i) const
{
    return scores[i];
}

ostream& Student::arr_out(ostream &os) const
{
    int lim = scores .size ();
    if(lim > 0)
    {
        for(int i = 0;i<lim;i++)
        {
            os<<scores[i]<<" ";
                if(i % 5 == 4)
                    os<<endl;
                if(i % 5 != 0)
                    os<<endl;
        }

    }
    else
        os<<"empty array";
    return os;
}

istream & operator >>(istream &is,Student &stu)
{
    is>>stu.name;
    return is;
}

istream & getline(istream& is,Student &stu)
{
    getline (is,stu.name);
    return is;

}

ostream & operator <<(ostream &os,const Student &stu)
{
    os<<"Scores for "<<stu.name<<":\n";
    stu.arr_out (os);
    return os;
}

void set(Student &sa,int n)
{
    cout<<"Please enter the student's name:"<<endl;
    getline (cin,sa);
    cout<<"Please enter"<<n<<"quiz scores"<<endl;
    for (int i = 0; i < n; ++i) {
        cin>>sa[i];
    }
    while (cin.get () != '\n') {
        continue;
    }
}

const int pupilsl = 3;
const int quizze = 5;
int main()
{
    Student ada[pupilsl] = {
        Student(quizze),
        Student(quizze),
        Student(quizze)
    };
    for (int i = 0; i < pupilsl; ++i) {
        set (ada[i],quizze);
    }
    cout <<"\nStudent List:\n";
    for (int i = 0; i < pupilsl; ++i) {
        cout<<ada[i].Name ()<<endl;
    }
    cout<<"\nResults:";
    for (int i = 0; i < pupilsl; ++i) {
        cout<<endl<<ada[i];
        cout<<"average:"<<ada[i].Average ()<<endl;
    }
    cout<<"Done.\n";

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值