//############################################################################
/* 隐式类型转换
*
* 类型转换可分为:
* 隐式 显式
* 标准类型转换 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++进阶--隐式类型转换的更多相关文章

  1. SQL进阶-隐式类型转换

    一.隐式类型转换 1.隐式类型转换 隐式类型转换: '; 程序可读性差,且依赖数据库的隐式转换规则,如果数据库升级,则程序可能无法正确执行: 有可能会导致索引失效: 有可能会导致意想不到的结果: 显式 ...

  2. js条件判断时隐式类型转换

    Javascript 中,数字 0 为假,非0 均为真 在条件判断运算 == 中的转换规则是这样的: 如果比较的两者中有布尔值(Boolean),会把 Boolean 先转换为对应的 Number,即 ...

  3. dynamic_cast 和 static_cast 隐式类型转换的区别

    首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion ...

  4. c++ operator操作符的两种用法:重载和隐式类型转换,string转其他基本数据类型的简洁实现string_cast

    C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换.对于操作符的重载,许多人都不陌生,但是估计不少人都不太熟悉operator的第二种用法,即自定义对象类型的隐式 ...

  5. C++的隐式类型转换与转换操作符

    C++标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象(创建临时对象).如果这种转换代价很大(调用类的构造函数),隐式转换将影响性能.隐式转换的发生条件:函数调用中, ...

  6. C++的隐式类型转换

    C++是一种复杂的语言,其中有许多“好玩”的特性,学习C++的过程就像在海边捡一颗颗石头,只要坚持不懈,也许一颗颗小石头也能建起你自己小小的城堡. 废话完后,讲讲自己捡到的石头:隐式类型转换 学习出处 ...

  7. 「译」JavaScript 的怪癖 1:隐式类型转换

    原文:JavaScript quirk 1: implicit conversion of values 译文:「译」JavaScript 的怪癖 1:隐式类型转换 译者:justjavac 零:提要 ...

  8. 【M21】利用重载技术避免隐式类型转换

    1.考虑UPint 的加法+,UPint a, b, result; 为了使result = a+10; result= 10+a; 都能通过编译,操作符重载如下: const UPint opera ...

  9. JS--显示类型转换Number—隐式类型转换

    显示类型转换 (强制类型转换):Number()parseInt()parseFloat() Number是整体转换--能够把一个看起来像数字的字符串转成数字--尽量去转换能转的都转了 var a = ...

随机推荐

  1. CSS使用方法

    CSS行内样式: 在开始标签内添加style样式属性 如:<p style="color:red;">内容</p> CSS内部样式: 内部样式(嵌入样式), ...

  2. camp待补

    待修莫对 序列自动机 几何积分 沈阳 M 待删除背包  : 分组背包 K-LIS, K次二分(插到最后stop) 问题转化为LIS bzoj2131 hdu4055 最小线段覆盖环 实时路况 分治+f ...

  3. django 一个关于分组查询的问题分析

    ret=Emp.objects.values('dep').annotate(avg_salary=Avg('salary')) print(ret) # ---*******单表分组查询ORM总结: ...

  4. C++学习(十六)(C语言部分)之 数组三

    复习 以及 测试 /* 一维数组 数组是相同的数据的一个集合 <类型><数组名>[下标表达式]={数组元素 初始值}; 数组名和变量的命名规则是一样的 数组名是一个地址 数组下 ...

  5. Cassandra Demo--Python操作cassandra

    ================================================================ 创建keyspace和table CREATE KEYSPACE ex ...

  6. Revit 开发将自己的窗口设置为Revit窗口

    在Revit开发中如果使用modeless的对话框,经常容易被Revit窗体覆盖,但是如果将窗体设为Topmost的话,当Revit失去焦点后,它又会遮住其他程序的界面,比如将Revit最小化后,To ...

  7. tomcat源码阅读之默认连接器

    默认连接器 一.UML图: 1.所有的连接器都要实现Connector接口,必须创建Request对象和Response对象,httpConnector作为默认连接器,肯定也是要实现Connector ...

  8. 应用端连接MySQL数据库报Communications link failure

    事情的起因: 某项目的开发同学突然Q我们组的某同学,要求我们调整MySQL的连接等待超时参数wait_timeout.要求我们从28800s调整到31536000s(也就是一年) 应用端测试环境的to ...

  9. pycharm加载多个项目

    菜单位置:File -> Settings -> Project:xxx -> Project Stucture Project:xxx中xxx一般是已有项目的名称 窗口右侧上点击A ...

  10. vim使用技巧大全

    1.vim清空内容 光标移到第一行,然后在非插入模式按10000后然后点dd .要嫌笨的话就在非插入模式下输入:.,$d 一回车就全没了 2.vim光标跳转操作 1.跳到文本的最后一行:按“G”,即“ ...