C++ 类的隐式转换
所谓类的隐式转换,就是将实参类型转成形参类型--如果不一致的话。
这个转换与基本类型转换不太一样,具体则是在形参类型的构造函数中使用实参类型的数据,从而构造出一个临时对象。
下面的代码,类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 ;
}
C++ 类的隐式转换的更多相关文章
- Scala之隐式转换
概述 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型. 隐式转换有四种常见的使用场景: 将某一类 ...
- Scala隐式转换和隐式参数
隐式转换 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象或者是给一个类增加方法.通过这些功能, ...
- Scala基础:闭包、柯里化、隐式转换和隐式参数
闭包,和js中的闭包一样,返回值依赖于声明在函数外部的一个或多个变量,那么这个函数就是闭包函数. val i: Int = 20 //函数func的方法体中使用了在func外部定义的变量 那func就 ...
- scala成长之路(3)隐式转换
不废话,先上例子:定义一个参数类型为String的函数: scala> def sayHello(name:String) = println("hello " + name ...
- 如何使用隐式转换扩展DataFrame和RDD以及其他的对象
目的 DataFrame可以点出来很多方法,都是DF内置的. 比如说:df.withColumn(),df.printSchema(). 但是如果你想打印df中的分区位置信息,以及每个key有多少记录 ...
- scala的隐式转换学习总结(详细)
一,隐式转换函数 1, 格式, implicit def 函数名(参数):返回值类型={ //函数体 //返回值 } 2,例子: //导入对应的规则类,以免出现警告 scala> import ...
- Scala中的Implicit(隐式转换,隐式参数,隐式类)
文章来自:http://www.cnblogs.com/hark0623/p/4196452.html 转发请注明 代码如下: /** * 隐式转换 隐式参数 隐式类 */ //隐式转换 class ...
- 21.C++- "++"操作符重载、隐式转换之explicit关键字、类的类型转换函数
++操作符重载 ++操作符分为前置++和后置++,比如: ++a; a++; ++操作符可以进行全局函数或成员函数重载 重载前置++操作符不需要参数 重载后置++操作符需要一个int类型的占位参数 ...
- scala中隐式转换之隐式转换调用类中本不存在的方法
/** * Created by root * Description : 隐式转换调用类中本不存在的方法 */ class Person(name : String){ def getPersonN ...
随机推荐
- 检测到 Mac 文件格式: 请将源文件转换为 DOS 格式或 UNIX 格式
非常简单可以解决: 方法一,用editplus打开,再复制回VS 方法二:在VS中,点文件->高级保存选项,然后在行尾选项中选择windows(CR LF),重新编译,ok
- Spring注解 强大了个强大--详解注解方式
好文章:http://tonyaction.blog.51cto.com/227462/83874/ http://www.ibm.com/developerworks/cn/java/j-lo-sp ...
- python标准库介绍——8 operator 模块详解
==operator 模块== ``operator`` 模块为 Python 提供了一个 "功能性" 的标准操作符接口. 当使用 ``map`` 以及 ``filter`` 一类 ...
- MySQL使用伪列
在查询数据库的时候,我们有时候需要对查询出来的数据加上序列,1,2,3,……n 例如:我们根据表的某个字段排序后,要对这些数据加上序列,这个时候序号常常不是我们建表时设置好的自增的主键id,怎么办呢? ...
- mysql-5.7中的innodb_buffer_pool_prefetching(read-ahead)详解
一.innodb的read-ahead是什么: 所谓的read-ahead就是innodb根据你现在访问的数据,推测出你接下来可能要访问的数据,并把它们(可能要访问的数据)读入 内存. 二.read- ...
- JavaScript与DOM(下)
介绍 上一章我们介绍了JavaScript的基本内容和DOM对象的各个方面,包括如何访问node节点.本章我们将讲解如何通过DOM操作元素并且讨论浏览器事件模型. 本文参考:http://net.tu ...
- linux shell 命令获取字符串/文件的MD5值
获取字符串的MD5值: 字符串“hello”的MD5: $ echo -n 'hello'|md5sum|cut -d ' ' -f1 得到的MD5值: 5d41402abc4b2a76b9719d9 ...
- thinkphp中获取参数值的方法
以获取$type这个参数为例:一:通过传统方法:$_GET, $_POST $type = intval($_GET['type'])这种方法需要自己写过滤规则,保证数据安全. 二:在Actio ...
- Statistical Concepts and Market Returns
Statistical Concepts and Market Returns Categories of statistics Descriptive statistics: used to sum ...
- JAVA calling convention
http://stackoverflow.com/questions/28126082/where-does-the-jit-compiled-code-reside https://wiki.ope ...