欢迎转载,但请标明作者 “九天雁翎”,当然,你给出这个帖子的链接更好。
老规矩,看个例子,知道我要说的是什么。
例4.0:
#include <string>
#include <iostream>
using namespace std;
class Fruit //定义一个类,名字叫Fruit
{
string name; //定义一个name成员
string colour; //定义一个colour成员
public:
bool isSame(const Fruit &otherFruit) //期待的形参是另一个Fruit类对象,测试是否同名
{
return name == otherFruit.name;
}
void print() //定义一个输出名字的成员print()
{
cout<<colour<<" "<<name<<endl;
}
Fruit(const string &nst,const string &cst = "green"):name(nst),colour(cst){} //构造函数
Fruit(){}
};
int main()
{
Fruit apple("apple");
Fruit orange("orange");
cout<<"apple = orange ?: "<<apple.isSame(orange)<<endl; //没有问题,肯定不同
cout<<"apple = /"apple/" ?:"<<apple.isSame(string("apple")); //用一个string做形参?
return 0;
}
你会发现最后的使用上,我们用一个string类型作一个期待Fruit类形参的函数的参数,结果竟然得出了是true(1),不要感到奇怪,这就是我现在要讲的东西,隐式类类型转换:“可以用单个实参来调用的构造函数定义了从形参类型到该类型的一个隐式转换。”(C++ Primer)首先要单个实参,你可以把构造函数colour的默认实参去掉,也就是定义一个对象必须要两个参数的时候,文件编译不能通过。然后满足这个条件后,系统就知道怎么转换了,不过这里比较严格:)以前我们构造对象的时候Fruit apple("apple")其实也已经有了一个转换,从const char *的C字符串格式,转为string,在这里,你再apple.isSame("apple")的话,蠢系统不懂得帮你转换两次,所以你必须要用string()来先强制转换,然后系统才知道帮你从string隐式转换为Fruit,当然其实你自己也可以帮他完成。cout<<"apple = /"apple/" ?:"<<apple.isSame(Fruit("apple"));这样。参考例子1.2 :Fruit apple = Fruit("apple");//定义一个Fruit类对象apple。也就是这样转换的。不过这就叫显式转换了,我们不标出来,系统帮我们完成的,叫隐式的贝。这里要说的是,假如你显示转换就可以不管有多少参数了,比如在前面提到的必须需要两个参数的构造函数时的例子。
例4.1:
#include <string>
#include <iostream>
using namespace std;
class Fruit //定义一个类,名字叫Fruit
{
string name; //定义一个name成员
string colour; //定义一个colour成员
public:
bool isSame(const Fruit &otherFruit) //期待的形参是另一个Fruit类对象,测试是否同名
{
return name == otherFruit.name;
}
void print() //定义一个输出名字的成员print()
{
cout<<colour<<" "<<name<<endl;
}
Fruit(const string &nst,const string &cst):name(nst),colour(cst){} //构造函数
Fruit(){}
};
int main()
{
Fruit apple("apple","green");
Fruit orange("orange","yellow");
cout<<"apple = orange ?: "<<apple.isSame(orange)<<endl; //没有问题,肯定不同
cout<<"apple = /"apple/" ?:"<<apple.isSame(Fruit("apple","green")); //显式转换
return 0;
}
在你不想隐式转换,以防用户误操作怎么办?C++提供了一种抑制构造函数隐式转换的办法,就是在构造函数前面加explicit关键字,你试试就知道,那时你再希望隐式转换就会导致编译失败,但是,要说明的是,显式转换还是可以进行,出于不提供错误源代码例子的原则,错误的情况就不提供了,自己试试吧:)在说这个东西之前,我还不懂,现在我懂了:)我现在好像都习惯边学边讲了,有什么错误,你可要指出来啊。
分享到:
相关推荐
类的转换,C++的内部数据类型遵循隐式类型转换规则,成员转换函数
单元十:数据类型的隐式转换-数据类型的隐式转换完整版资料.pptx
LS-DYNA显示和隐式求解步骤,一步步教你怎么做,十分详细
行业分类-设备装置-多角度无间隙隐式钢结构幕墙.zip
C++可以定义如何将其他类型的对象隐式转换为我们的类类型或将我们的类类型的对象隐式转换为其他类型。为了定义到类类型的隐式转换,需要定义合适的构造函数。 说明:可以用单个实参来调用的构造函数定义了从形参...
行业分类-设备装置-半隐式类粒子法的大规模并行处理方法.zip
C语言隐式类型转换规则。了解一下对写程序有好处,可以防止不必要的错误
Scala 专题教程 - 隐式变换和隐式参数-内含源码以及设计说明书(可以自己运行复现).zip
电子政务-江河堤岸半隐式水力发电机.zip
主要介绍了c++隐式类型转换的二个示例,需要的朋友可以参考下
行业分类-设备装置-基于稀疏隐式特征表达的有监督在线话题模型学习方法.zip
行业分类-设备装置-基于隐式公钥证书的双方认证密钥协商方法及系统
C++ 多个类的DLL封装以及隐式链接和显式链接2种方法调用
电信设备-基于可见光隐式成像通信的增强现实方法、系统和终端.zip
提出一种有效的隐式曲面三角网格化算法。从隐式曲面上的一个种子点开始,生成网格的边界作为扩张多边形,且该多边形最小角对应的顶点为扩张点,计算从扩张点处欲生成的三角网格,为了防止新生成的三角网格和已经存在...
传统推荐系统研究很少利用评论数据来提高推荐性能,评论...特别是当系统面临用户冷启动困境时,即只有少量用户评分数据可被收集到时,推荐提升效果更为显著,这表明丰富的评论数据能够被转换为改善推荐系统的有用知识。
C++高级程序设计实验报告实验十 多态性—类型转换与虚函数 1.理解掌握运算符[]、()的重载; 2.理解类型转换,掌握类型转换函数的设计和使用; 3.理解和掌握虚函数的作用; 4.掌握利用虚函数实现C++的运行时多态...
本文将要为您介绍的是Mysql隐式类型转换原则,具体实现方法: MySQL 的隐式类型转换原则: - 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种...
c编程过程中的数据类型隐式转换,帮助初学者了解数据结构的类型,减少数据类型锁带来的编码错误
RedisPipe - 具有隐式流水线操作的Go开发的高吞吐量Redis客户端