首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
编程语言
> 详细
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
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
Spring Cloud 从入门到精通(一)Nacos 服务中心初探
2021-07-29
基础的排序算法
2021-07-29
SpringBoot|常用配置介绍
2021-07-29
关于 .NET 与 JAVA 在 JIT 编译上的一些差异
2021-07-29
C语言常用函数-toupper()将字符转换为大写英文字母函数
2021-07-29
《手把手教你》系列技巧篇(十)-java+ selenium自动化测试-元素定位大法之By class name(详细教程)
2021-07-28
4-1 YAML配置文件 注入 JavaBean中
2021-07-28
【python】 用来将对象持久化的 pickle 模块
2021-07-28
马拉车算法
2021-07-28
用Python进行冒泡排序
2021-07-28
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!