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 = ...
随机推荐
- SFM(structure from motion)学习记录(一)
visualSFM用法 添加图片 "File->Open Multi Images". 一次添加多幅图片 "SfM->Load NView Match&quo ...
- Go Example--常量
package main import ( "fmt" "math" ) const s string = "constant" //定义字 ...
- ios-邮箱正则表达式判断
- (void)loadData { NSMutableArray *array = [NSMutableArray arrayWithCapacity:10]; if ([self.title is ...
- Python面试 【315+道题】
Python面试 [315+道题] 第一部分 Python基础篇(80题) 为什么学习Python? 因为看到python的发展趋势,觉得需要与时俱进,第一点,python开发速度极快,能快速完成一个 ...
- xenserver使用快照创建虚拟机,提示eth0 has different mac错误
这个报错的意思就是说mac地址错误 我们对比后可以发现,用快照创建的虚拟机和原虚拟机的eth0那个配置文件的 mac地址是一样的,因为mac地址具有唯一性,所以就报这个错,无法配置ip上网 解决方法很 ...
- SimpleEntity
项目地址 : https://github.com/kelin-xycs/SimpleEntity SimpleEntity 一个 用 C# 实现的 简单的 持久层 Entity 实现 . 这是一个 ...
- apt-get update 与 apt-get upgrade 的区别
总而言之,update是更新软件列表,upgrade是更新软件:所以,这两命令都是一块用,update后再upgrade. update 是更新 /etc/apt/sources.list 和 /et ...
- webpack 3 升级到 webpack 4,遇到问题解决
报错:Error: Chunk.entrypoints: Use Chunks.groupsIterable and filter by instanceof Entrypoint instead 解 ...
- TypeScript 之 泛型
https://m.runoob.com/manual/gitbook/TypeScript/_book/doc/handbook/Generics.html 泛型:可以支持多种类型的数据 泛型函数的 ...
- 不能将“this”指针从“const SqQueue<ElementType>”转换为“SqQueue<ElementType> &
错误 1 error C2662: “int SqQueue<ElementType>::getLength(void)”: 不能将“this”指针从“const SqQueue<E ...