C++进阶--隐式类型转换
//############################################################################
/* 隐式类型转换
*
* 类型转换可分为:
* 隐式 显式
* 标准类型转换 A B
* 用户定义类型转换 C D
* (casting)
*
*
* A: 隐式标准类型转换
*/
char c = 'A';
int i = c; // 整型提升
char* pc = 0; // int -> Null pointer
void f(int i);
f(c);
dog* pd = new yellowdog(); // 指针类型转换
/*
* C: 隐式用户定义类型转换
*
* 在类内定义
*
* 转换 1: 将其他类型对象转成当前类型的对象
* - 具有可以接收一个参数的构造函数
* 转换 2: 将当前类对象转换成其他类型
* - 使用类型转换函数
*/
class dog {
public:
dog(string name) {m_name = name; } // NO explicit,单个参数的构造函数,如果没有显式地explicit,它同时也是类型转换函数
// 如果不想隐式地定义类型转换,加上explicit
string getName() {return m_name;}
private:
string m_name;
};
void main ()
{
string dogname = "Bob";
dog dog1 = dogname;
printf("My name is %s.\n", dog1.getName());
}
OUTPUT:
My name is Bob
/* 原则: 使接口易于正确使用,不易错误使用
* 理想情况,无法编译通过
*
* 一般指导原则:
* 1. 避免定义看起来不期望的转换
* 2. 避免双向隐式转换,会出现二义性
*/
//转换 2:
//operator string () const { return m_name; }
// string str = dog1;
//
/* 隐式类型转换在处理数值类型的类时很有用
* 比如分数类
*/
class Rational {
public:
Rational(int numerator = 0, int dennominator = 1):
num(numerator),den(denominator) {}
int num; // Demo only, public data members are not recommended
int den;
const Rational operator*(const Rational& rhs) {
return Rational(num*rhs.num, den*rhs.den);
}
};
int main ()
{
Rational r1 = 23;
Rational r2 = r1 * 2;
}
// Rational r3 = 3 * r1; //如果要想使用需要定义非成员函数版本运算符函数
const Rational operator*( const Rational& lhs, const Rational& rhs) {
return Rational(lhs.num*rhs.num, lhs.den*rhs.den);
}
// 如果同时定义了类对象到外部类型的转换:
operator int () const { return num/den; }
// 会出现二义性
C++进阶--隐式类型转换的更多相关文章
- SQL进阶-隐式类型转换
一.隐式类型转换 1.隐式类型转换 隐式类型转换: '; 程序可读性差,且依赖数据库的隐式转换规则,如果数据库升级,则程序可能无法正确执行: 有可能会导致索引失效: 有可能会导致意想不到的结果: 显式 ...
- js条件判断时隐式类型转换
Javascript 中,数字 0 为假,非0 均为真 在条件判断运算 == 中的转换规则是这样的: 如果比较的两者中有布尔值(Boolean),会把 Boolean 先转换为对应的 Number,即 ...
- dynamic_cast 和 static_cast 隐式类型转换的区别
首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion ...
- c++ operator操作符的两种用法:重载和隐式类型转换,string转其他基本数据类型的简洁实现string_cast
C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换.对于操作符的重载,许多人都不陌生,但是估计不少人都不太熟悉operator的第二种用法,即自定义对象类型的隐式 ...
- C++的隐式类型转换与转换操作符
C++标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象(创建临时对象).如果这种转换代价很大(调用类的构造函数),隐式转换将影响性能.隐式转换的发生条件:函数调用中, ...
- C++的隐式类型转换
C++是一种复杂的语言,其中有许多“好玩”的特性,学习C++的过程就像在海边捡一颗颗石头,只要坚持不懈,也许一颗颗小石头也能建起你自己小小的城堡. 废话完后,讲讲自己捡到的石头:隐式类型转换 学习出处 ...
- 「译」JavaScript 的怪癖 1:隐式类型转换
原文:JavaScript quirk 1: implicit conversion of values 译文:「译」JavaScript 的怪癖 1:隐式类型转换 译者:justjavac 零:提要 ...
- 【M21】利用重载技术避免隐式类型转换
1.考虑UPint 的加法+,UPint a, b, result; 为了使result = a+10; result= 10+a; 都能通过编译,操作符重载如下: const UPint opera ...
- JS--显示类型转换Number—隐式类型转换
显示类型转换 (强制类型转换):Number()parseInt()parseFloat() Number是整体转换--能够把一个看起来像数字的字符串转成数字--尽量去转换能转的都转了 var a = ...
随机推荐
- Codeforces Round #516(Div 2)
比赛链接:传送门 A. Make a triangle!(简单思维) 题目大意: 给你三条边,问你最多加多少长度能使这三条边能构成三角形. 思路: 最大边小于答案加另外两条边的和. #include ...
- IIS下使用 HTTP/2
IIS 使用 HTTP/2 什么叫HTTP/2? HTTP 2.0即超文本传输协议 2.0,是下一代HTTP协议.是由互联网工程任务组(IETF)的Hypertext Transfer Protoco ...
- EasyUI datagrid 选择单元格 出现文本框 修改 四
@disabled = "disabled", 只读属性 数据初始化 public JsonResult RateList(string dispatch_number, stri ...
- windows知识
文章目录 系统 修改远程桌面的端口号 IE选项中reset web setting不可用(灰色)的解决办法 重装系统后,修改默认程序安装目录.我的文档.桌面 路径 Keep network addre ...
- TECH books
文章目录 TECH books linux vxworks bat c gdb c++ vbscript make java bash perl web uml software-misc cpu e ...
- Replicated Ship 本地 kubernetes 环境试用
关于介绍可以参考 https://github.com/replicatedhq/ship 或者我写的一个比较简单的demo https://www.cnblogs.com/rongfengliang ...
- Unity3D协同函数与异步加载功能实战 学习
- div中 li宽度不固定 ie6和ie7不兼容不自动换行
我的li因为内容字数不一样,所以宽度不固定,给他float:left属性后,ie6和ie7不兼容,不自动换行!我给ul或者li: ul{white-space: nowrap} 属性还是不管用..最后 ...
- 全网最详细的Windows系统里Oracle 11g R2 Client(64bit)的下载与安装(图文详解)
不多说,直接上干货! 环境: windows10系统(64位) 最好先安装jre或jdk(此软件用来打开oracle自带的可视化操作界面,不装也没关系:可以安装plsql,或者直接用命令行操作) Or ...
- Redis 可视化界面工具:Fastoredis
下载地址:https://sourceforge.net/projects/fastoredis/