C++不同类型转换--1

简介: C++不同类型转换--1

内置类型的转换:


       内置类型之间的转换之前提过。相同类型的赋值直接进行,但不同类型之间的赋值系统会将将其转换成临时变量,这个临时变量具有常性,然后再将这个临时变量进行赋值,这里就不做代码演示了。自定义类型转换为内置类型暂时先不做考虑,后面深入文章会进行深入讲解。


       这里要说明的是这里也不是什么内置类型都可以进行转换,当两个不同类型之间相似度较小时可以发生,当相差较大时就可能会报错。如:double与int之间相似度较大,可以发生;int与int*相似度就较小,可能会报错。如下:


int* ptr = nullptr;
int a = ptr;//出错
double d = 1.2;
int x = d;//转换成功

自定义类型的转换:


       自定义类型的隐式转换其实发生在构造函数中,构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用。


       自定义类型与自定义类型之间相当于直接赋值或拷贝构造,内置类型直接赋值自定义类型之间会发生隐式转换,即内置类型对象隐式转换成自定义类型对象。其中能支持这个转换,是因为有自定义类型的int单参数构造函数(支持传一个参数多参数带缺省也可以)支持。如下图:


7e54770a54e248f9af071bea072b75e5.png


       当发生一个参数多参数带缺省的情况时,隐式转换默认自定义类型成员的第一个参数进行转换。我们也可多个内置类型赋值转换。这些转换其实跟调用构造函数的效果相同。


       当内置类型向自定义类型中的内置类型发生转换时,会根据内置类型转内置类型的原则进行,即系统内部会做两次转换。如下图:


class A
{
        A(int a) {   }  
}
int main()
{
//这种转换正常进行,系统内部做了两次转换。第一步内置类型转内置类型,即先将浮点型3.3转换成int型,然后再用int型传入构造函数进行定义类型转换。而指针型就不可以。
        A x = 3.3;
        return 0;
}


代码演练一:(单参构造函数)

#include <iostream>
using namespace std;
class A
{
public:
  A(int a)
  :_a(a)
  { }
  void Print() {
  cout << _a << endl;
  }
private:
  int _a;
};
int main()
{
  A x1 = 5;//隐式类型转换为自定义类型对象
  x1.Print();//输出5
}


代码演练二:(多参数带缺省)


#include <iostream>
using namespace std;
class Date
{
public:
  Date(int year = 2023, int month = 10, int day = 16)
  : _year(year)
  , _month(month)
  , _day(day)
  { }
  void Print() {
  cout << _year << "/" << _month << "/" << _day << endl;
  }
private:
  int _year;
  int _month;
  int _day;
};
int main()
{
  //单个隐式转换
  Date d1 = 5;//Date d1(5)的效果与之一样
  //多个隐式转换
  Date d2 = { 1,2,3 };//Date d2(1,2,3)的效果与之一样
  //括号表达式的运用
  Date d3 = (1, 2, 3);//等价于 Date d2 = 3;
  d1.Print();//输出5/10/16,属于单个隐式转换
  d2.Print();//输出1/2/3,属于多个隐式转换
  d3.Print();
  return 0;
}

C++不同类型转换--2 https://developer.aliyun.com/article/1424637?spm=a2c6h.13148508.setting.22.214f4f0eqBSn46

相关文章
|
7月前
|
安全 编译器 程序员
【C++】C++的类型转换
【C++】C++的类型转换
|
7月前
|
设计模式 安全 算法
【C/C++ 类型转换 】深入理解C++向上转型:从基础到应用
【C/C++ 类型转换 】深入理解C++向上转型:从基础到应用
225 0
|
27天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
70 5
|
2月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
24 1
|
2月前
|
存储 编译器 数据安全/隐私保护
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解2
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
37 3
|
2月前
|
编译器 C++
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解1
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
49 3
|
7月前
|
存储 安全 编译器
C++:现代类型转换
C++:现代类型转换
54 5
|
2月前
|
C++
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
26 0
|
5月前
|
存储 安全 编译器
【C++11】类型转换
【C++11】类型转换
36 0
|
5月前
|
安全 程序员 编译器
C++一分钟之-C++中的类型转换
【7月更文挑战第8天】C++中的类型转换涉及隐式和显式操作,隐式转换如从`int`到`double`是自动的,但可能导致数据丢失。显式转换包括`static_cast`, `dynamic_cast`, `const_cast`, `reinterpret_cast`,以及转换构造函数。要避免数据丢失、类型不匹配和运行时错误,需谨慎使用显式转换并检查结果。过度使用`reinterpret_cast`应避免。理解这些转换有助于编写更安全的代码。
47 0