码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-05-19 10:46:21      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

//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;
}

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

标签:

原文地址:http://blog.csdn.net/linukey/article/details/45831953

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!