自动类型转换之构造函数

在c/c++中,如果编译器看到一个表达式或函数调用使用了一个不适合的类型,它经常会执行一个自动类型转换,从现在的类型到所有要求的类型。在内置类型中我们经常看到例如:

char c;

int i=c;

上述语句就执行了自动类型转换。但是上面只是内置类型的自动类型转换,在c++中,还支持用户自定义的自动类型转换。有两种方法可以实习,第一种方法就是特殊类型的构造函数,第二种就是重载的运算符。

首先介绍第一种,特殊的构造函数。如果定义一个构造函数,这个构造函数把另一个类型的对象或者引用当做它的单个参数,那么这个构造函数允许编译器执行自动类型转换。

 1 #include<iostream>
 2 using namespace std;
 3 class One{
 4 public:
 5     One(){
 6         cout << "One()" << endl;
 7         cout << "&vr=" << (long)this<< endl;
 8     }
 9     ~One(){
10         cout << "~One()" << endl;
11     }
12 };
13
14 class Two{
15
16 public:
17     Two(const One& vr){//Two的构造函数,有一个One类型的引用当做参数
18         cout << "Two(const One&)" << endl;
19         cout << "&vr=" << (long)&vr << endl;
20     }
21     ~Two(){
22         cout << "~Two()" << endl;
23     }
24 };
25
26 void fun(const Two& vr){
27
28     cout << "fun(Two)" << endl;
29     cout << "&vr=" << (long)&vr << endl;//我们最后发现,在fun中的对象的地址和main函数中定义的One对象的地址不一样,可以推断,是从新生成了一个新的对象。
30 }
31
32 int main(){
33     One one;
34     fun(one);
35     return 0;
36 }

当编译器看到f()以类One的对象为参数调用时,编译器检查f()的声明并注意到f()函数需要一个类Two的对象作为参数,然后编译器检查是否有从对象One到Two的方法。它发现了构造函数Two::Two(const One&),然后Two::Two(const One&)被调用,就会生成一个Two对象,然后Two对象被传递给f()。

但是有时候通过构造函数自动类型转换可能出现问题,为了避免这种麻烦,可以通过前面加关键字explicit(这个关键字只能用于构造函数)来对上例类Two的构造函数进行改进。

 1 class Two{
 2
 3 public:
 4     explicit Two(const One& vr){//添加了关键字explicit
 5         cout << "Two(const One&)" << endl;
 6         cout << "&vr=" << (long)&vr << endl;
 7     }
 8     ~Two(){
 9         cout << "~Two()" << endl;
10     }
11 };

这是在main函数中就不能f(one)这样调用f函数了,要f(Two(one));这样调用函数f。

时间: 2024-12-21 14:29:32

自动类型转换之构造函数的相关文章

自动类型转换之运算符重载

第二种自动类型转换的方法是运算符重载,其是形式是operator 目的类型();   这个函数通过在关键字operator后跟随想要转换到的类型的方法,将当前类型转换为希望的类型.这种形式的运算符重载是独特的,因为没有指定返回值类型,其返回值类型就是正在重载运算符的名字. 1 #include<iostream> 2 using namespace std; 3 4 class Three{ 5 int i; 6 public: 7 Three(int ii=0) :i(ii){ 8 9 }

C语言自动类型转换

自动转换遵循以下规则: 1) 若参与运算量的类型不同,则先转换成同一类型,然后进行运算. 2) 转换按数据长度增加的方向进行,以保证精度不降低.(eg:int型和long型运算时,先把int量转成long型后再进行运算.) a.若两种类型的字节数不同,转换成字节数高的类型 b.若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型 3) 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算. 4) char型和short型参

java的自动类型转换和强制类型转换

一.自动类型转换 在 Java 程序中,不同的基本数据类型的数据之间经常需要进行相互转换.例如: , 代码中 int 型变量 score1 可以直接为 double 型变量 score2 完成赋值操作,运行结果为: 82.0  这种转换称为自动类型转换. 当然自动类型转换是需要满足特定的条件的:目标类型大于元类型 二.强制类型转换 当程序中需要将 double 型变量的值赋给一个 int 型变量,该如何实现呢? 显然,这种转换是不会自动进行的!因为 int 型的存储范围比 double 型的小.

Java自动类型转换和强制类型转换

1.容量小的数据类型可以自动转成容量大的数据类型(注:容量大指的是数据类型表征的范围大.) 2.数据自动类型转换: cast:转型 long型可以自动转换成float但是可能丢失精度. int型转换为char型需要强制转型. 但是char型转成int是不需要强制转换. 3.表达式中类型提升问题.

自动类型转换

说完了强制类型转换,再来看看自动类型转换,实际上自动类型转换是建立在强制类型转换的基础上,当预期某个位置应该是某类型(布尔.数值.字符串)的数据时,就会调用相应的强制类型转换函数,这个是自动进行的. *当JavaScript遇到预期为布尔值的地方(比如if语句的条件部分),就会将非布尔值的参数自动转换为布尔值.系统内部会自动调用Boolean函数. 因此除了以下六个值,其他都是自动转为true. undefined null -0 0或+0 NaN ''(空字符串) *当JavaScript遇到

功能:自动类型转换

#include<stdio.h> main() { float x,y; long m,n; x=3/2+8/3; y=3.0/2+8/3.0; m=1*2*3*4*5*6*7*8*9; n=1L*2*3*4*5*6*7*8*9; printf("x=%f,y=%f,m=%ld,n=%ld\n",x,y,m,n); } 功能:自动类型转换,布布扣,bubuko.com

PHP第五课 自动类型转换与流程控制

学习概要: 1.了解自动类型转换的有哪些 2.了解基本的流程控制语句 3.实例:实现日历表格的写法 自动类型转换 1)整型转字符串 echo $num."abc"; 2)字符串转整型 $str+3; 3)转布尔类型 为假情况 0 "" "0" false array() null 未定义 4)强制类型转换 (int)$str (float)$str (string)$str 5)常量 define("HOST","l

struts基于ognl的自动类型转换需要注意的地方

好吧,坎坷的过程我就不说了,直接上结论: 在struts2中使用基于ognl的自动类型转换时,Action中的对象属性必须同时添加get/set方法. 例如: 客户端表单: <s:form action="registPro"> <s:textfield name="user.id" label="id"/> <s:textfield name="user.name" label="用户

我的Java开发学习之旅------&gt;解惑Java进行三目运算时的自动类型转换

今天看到两个面试题,居然都做错了.通过这两个面试题,也加深对三目运算是的自动类型转换的理解. 题目1.以下代码输出结果是(). public class Test { public static void main(String[] args) { int a=5; System.out.println("value is :"+((a<5)?10.9:9)); } } A.编译错误     B.10.9           C.9           D.以上答案都不对 我不假