c++的转换

本文详细介绍了C++中的五种类型匹配规则,并列举了基本数据类型间的转换层级。此外,还探讨了指针类型之间的转换规则及如何通过定义null对象避免函数调用中的歧义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++区分了5种匹配:

1.匹配中不转换或者只使用不可避免的转换(例如,从数组名到指针,函数名到函数指针,以及Tconst T

2.使用了整数的提升的匹配:(从char 到 int, short int , 以及 它们对应的unsigned 类型)以及float double,还有一个就是 boolint

3.使用了标准转换的匹配(例如 intdouble, derived *base*, unsigned int 到 int

4.使用了用户定义转换的匹配;(包裹通过构建函数和转换操作)

5.使用了在函数声明里的省略号...的匹配

下面是我写的基本类型之间转换,从上到下级别越低。

1.char char ->char 

  Char->int

Char->unsigned intlong、 float、 doublebool

2.int :  int -> int

Int ->char unsigned intlong、 float、 doublebool

3.unsigned int :  uint->uint

uint->char int  、long、 float、 doublebool

4.long:  long->long

Long ->char int unsigned int、 float、 doublebool

5.float  float-> float

Float->double

Float->char int unsigned intlong、 bool

6.double: double->double

Double->char int unsigned intlong、 float、 double

7.bool:  bool->bool

Bool->int

Bool->char unsigned intlong、 float、 double

Unsigned int 到 int的转换不是类型的提升。

指针的转换:

指针之间没有标准转换(只能精确匹配),除了各种指针到void*指针的转换。

还忘记一个吧:

那就是0到指针的转换:

什么是0c++0可以使int 0, float 0等,还有一个拿就是空指针。

1.Long int 0null指针的转换和long int 0int 0的转换是一样的。

#define null 0l            // null现在是一个long int

void f(int x);
void f(string *p);

f(null);                   // 错误!——歧义

同理:float 0NULL的转换和到double 类型0是一样的。

2.0常量到各种指针NULL的转换是一样的。

Void f(int  *x);

Void f(void *x);

F(0);//二义性,出错

还有就是NULL指针到0

1.NULLint  0的转换要比到int *double*、 float *)等 NULL的指针级别要高。

Void f(int *i);

Void f(int i);

F(NULL);//调用的是fint);

2.NULL 到 除了int 0的转换级别(包裹 各种类型 和 指针)都一样。

Void f(int *i);

Void(long i);

F(NULL);//出错,有二义性。

在《effective C++》中一章《避免对指针和数字类型重载》有讲到怎么样对实现一个null对象来避免0null在函数调用时产生歧义。

我摘抄了一部分:

const                             // 这是一个const对象...
class {
public:
  template<class t>               // 可以转换任何类型
    operator t*() const           // null非成员指针
    { return 0; }                 //

  template<class c, class t>      // 可以转换任何类型
    operator t c::*() const       // null成员指针
    { return 0; }

private:
  void operator&() const;         // 不能取其地址
                                  // (见条款27)

} null;                           // 名字为null

用下面的程序来测试一下

void f(int x);
void f(string *p);

f(null); //调用fstring *)。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值