所谓类的隐式转换,就是将实参类型转成形参类型--如果不一致的话。

这个转换与基本类型转换不太一样,具体则是在形参类型的构造函数中使用实参类型的数据,从而构造出一个临时对象。

下面的代码,类Person 的成员函数 isSamePerson(const Person &person) const ,理论上需要一个 Person 引用,但实际上被传递了一个 string对象

编译器会自动调用 Person tmp(str)构造函数 来构造一个临时对象,而不是真的将 string类型 转成 Person 类型!

代码:

#include <iostream>
#include <string> using namespace std; class Person{
private:
string name;
int id; public:
Person(const string &nm=string("xxx")):name(nm),id(){} //就不用默认无参构造了 ;隐式转换 public:
bool isSamePerson (const Person &person) const{ //const成员函数 ,只能调用const成员(变量、函数)!
cout<<"比较对象:"<<person.getId()<<"--"<<person.getName()<<endl;//
return id == person.getId(); //
} const int &getId() const{ //任意一个const去掉后,都会导致问题。。。
return id;
}
const string &getName() const{ //因为const修饰的是this指向的对象,所以也必须返回const引用
return name;
}
}; int main(){
string a="aaa";
Person p1(a);
cout<<p1.getId()<<"--"<<p1.getName()<<endl; string b="bbb";
cout<<p1.isSamePerson(b)<<endl; //隐式转换!!! return ;
}

尽管有时候这样的转换是我们需要的,但也有不需要的时候,这个时候,给类中的构造函数声明加上explicit,则会防止在需要隐式转换的上下文中使用该构造函数。

#include <iostream>
#include <string> using namespace std; class Person{
private:
string name;
int id; public:
explicit Person(const string &nm=string("xxx")):name(nm),id(){} //就不用默认无参构造了 ;显式 explicit public:
bool isSamePerson (const Person &person) const{ //const成员函数
cout<<"比较对象:"<<person.getId()<<"--"<<person.getName()<<endl;//
return id == person.getId(); //
} const int &getId() const{ //任意一个const去掉后,都会导致问题。。。
return id;
}
const string &getName() const{ //因为const修饰的是this指向的对象,所以也必须返回const引用
return name;
}
}; int main(){
string a="aaa";
Person p1(a);
cout<<p1.getId()<<"--"<<p1.getName()<<endl; string b="bbb";
cout<<p1.isSamePerson(Person(b))<<endl;//显式转换!!! return ;
}
 
结论:除非有明显的理由想要使用隐式转换,否则,单形参的构造函数应该设置为explicit
 
 
其他:前向声明只能用于使用指针或引用的情况。

C++ 类的隐式转换的更多相关文章

  1. Scala之隐式转换

    概述 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型. 隐式转换有四种常见的使用场景: 将某一类 ...

  2. Scala隐式转换和隐式参数

    隐式转换 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象或者是给一个类增加方法.通过这些功能, ...

  3. Scala基础:闭包、柯里化、隐式转换和隐式参数

    闭包,和js中的闭包一样,返回值依赖于声明在函数外部的一个或多个变量,那么这个函数就是闭包函数. val i: Int = 20 //函数func的方法体中使用了在func外部定义的变量 那func就 ...

  4. scala成长之路(3)隐式转换

    不废话,先上例子:定义一个参数类型为String的函数: scala> def sayHello(name:String) = println("hello " + name ...

  5. 如何使用隐式转换扩展DataFrame和RDD以及其他的对象

    目的 DataFrame可以点出来很多方法,都是DF内置的. 比如说:df.withColumn(),df.printSchema(). 但是如果你想打印df中的分区位置信息,以及每个key有多少记录 ...

  6. scala的隐式转换学习总结(详细)

    一,隐式转换函数 1, 格式, implicit def 函数名(参数):返回值类型={ //函数体 //返回值 } 2,例子: //导入对应的规则类,以免出现警告 scala> import ...

  7. Scala中的Implicit(隐式转换,隐式参数,隐式类)

    文章来自:http://www.cnblogs.com/hark0623/p/4196452.html  转发请注明 代码如下: /** * 隐式转换 隐式参数 隐式类 */ //隐式转换 class ...

  8. 21.C++- "++"操作符重载、隐式转换之explicit关键字、类的类型转换函数

    ++操作符重载 ++操作符分为前置++和后置++,比如: ++a;  a++; ++操作符可以进行全局函数或成员函数重载 重载前置++操作符不需要参数 重载后置++操作符需要一个int类型的占位参数 ...

  9. scala中隐式转换之隐式转换调用类中本不存在的方法

    /** * Created by root * Description : 隐式转换调用类中本不存在的方法 */ class Person(name : String){ def getPersonN ...

随机推荐

  1. python标准库介绍——23 UserString 模块详解

    ==UserString 模块== (2.0 新增) ``UserString`` 模块包含两个类, //UserString// 和 //MutableString// . 前者是对标准字符串类型的 ...

  2. 使用matlab处理图像的基础知识

    MATLAB基本函数一 矩阵运算 1.基本算数运算(加减乘除) + -运算要求矩阵维数相同,例m*n * /运算,例A=B*C,B矩阵是m*n矩阵,B是n*p矩阵,则A是m*p矩阵 A/B相当于A*i ...

  3. java与数据库交互常用到的一些方法

    下面我整理了一下java中常用的几个与数据库交互的常用方法,仅供参考: 1.执行SQL(dao层的实现类中) (1)SQL查询: //import org.hibernate.Query;//impo ...

  4. Oracle学习笔记之二,Oracle 11g体系结构

    Oracle 11g体系结构概述 实例(Instance),是指一组Oracle后台进程以及在服务器中分配的共享内存区域: 数据库(Database),是由基于磁盘的数据文件.控制文件.日志文件.参数 ...

  5. jdbc连接hive0.14

    Jdbc连接hive0.14版本号 眼下官网最新版本号是hive0.13,要想下载最新的hive得去git上去clone一个. Hive0.14最大特点是支持直接插入. 如今做一个jdbc连接hive ...

  6. 用js实现预览待上传的本地图片

    js实现预览待上传的本地图片,代码如下: <form name="form5" id="form5" method="post" ac ...

  7. js 判断checkbox是否选中的实例代码

    分享下js判断是否选中CheckBox的方法. 代码如下: <input type="checkbox" name="checkbox1" checked ...

  8. pannel加载窗体

    public static void loadFillForm(Panel panel, System.Windows.Forms.Form frm) { if (frm != null && ...

  9. 在IntentService中使用Toast与在Service中使用Toast的异同

    1. 表象 Service中能够正常显示Toast,IntentService中不能正常显示Toast.在2.3系统上,不显示toast,在4.3系统上,toast显示.可是不会消失. 2. 问题分析 ...

  10. 解决Pycharm中module 'pip' has no attribute 'main'的问题

    背景:pip升级至10.0.1后,使用Pycharm安装Package时一直提示module 'pip' has no attribute 'main'报错信息. 解决方法: 找到Pycharm安装目 ...