C++类转换构造函数和转换函数复习

//C++类转换构造函数和转换函数复习
#include<iostream>
#include<string>


using namespace std;


class Student
{
private:
    string name;
    int age;
    double grade;
public:
    Student(string name_, int age_, double grade_):name(name_), age(age_), grade(grade_){}
    Student(){}
    Student(double grade_) //转换构造函数
    {
        grade = grade_;
    }
    Student(int age_)
    {
        age = age_;
    }
    explicit Student(string name_)
    {
        name = name_;
    }


    operator int() //转换函数
    {
        return age;
    }
    explicit operator string()
    {
        return name;
    }


    string get_name()
    {
        return name;
    }
    int get_age()
    {
        return age;
    }
    double get_grade()
    {
        return grade;
    }
};


int main()
{
    //一、转换构造函数进行类型转换
    cout << "----------------------------" << endl;
    Student s1{"linukey", 20, 100};
    cout << s1.get_grade() << endl;
    s1 = 300.0;
    cout << s1.get_grade() << endl; //因为类中声明了单参数为double的构造函数,所以可以直接把double类型的变量赋给s1


    //二、用explicit限制转换构造函数的隐式转换
    cout << "----------------------------" << endl;
    Student s2{"linukey", 20, 100};
    cout << s2.get_name() << endl;
    string temp1 = "lin";
    //s2 = temp1;  //因为explicit限制了string类型与Student类型的隐式转换,所以这里会出错


    //三、当多个相近类型同时存在时,编译器会优先选择最合适的,但是有时也会出现二义性
    cout << "----------------------------" << endl;
    Student s3{"linukey", 20, 100};
    cout << s3.get_grade() << endl;
    cout << s3.get_age() << endl;
    s3 = 300;
    cout << s3.get_grade() << endl; //因为上面的300是int类型,所以编译器优先选择int类型的隐式转换,所以下面的age输出300,但是这里的grade却输出乱码
    cout << s3.get_age() << endl;


    //四、错误的二义性 如果有一个int类型和一个double类型的类构造函数,而我们把一个long类型的变量赋值给Student,那么就会出错
    cout << "-----------------------------" <<endl;
    Student s4{"linukey", 20, 100};
    long temp2 = 100;
    //s4 = temp2;  编译器会报错,因为出现二义性,且没有完全合适的long类型


    //五、转换函数 我们前面说了单参数的类构造函数可以把其他类型赋值给类类型,但是反过来呢?这就用到了转换函数
    cout << "-----------------------------" << endl;
    Student s5{"linukey", 20, 100};
    int temp3 = s5; //因为声明了int类型的转换函数,所以可以把Student类型的变量转换为int类型
    cout << temp3 << endl;
    //注意,这里的转换函数依然要遵循上面的二义性的要求,不然就会出现二义性的错误


    //六、explicit关键字限制转换函数   有的时候我们不想让转换函数隐式的执行,而是显示的执行,那么我们就需要用explicit关键字进行限制
    cout << "-----------------------------" << endl;
    Student s6{"linukey", 20, 100};
    //string temp4 = s6; //注意,这里会报错,因为我们使用了explicit关键字限制了转换函数,所以不能进行隐式的转换
    string temp4 = (string)s6; //我么可以通过显示的转换,来达到使用目的,和更高的安全性
    cout << temp4 << endl;
    
    /*
    转换函数的要求:
    1.转换函数必须是类方法
    2.转换函数可以返回值,但是不能指定返回类型
    3.转换函数不能有参数
    */




    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值