C++ 转换构造函数

c++,转换,构造函数 · 浏览次数 : 14

小编点评

在 C++ 中,如果一个构造函数只有一个参数,那么这个构造函数就是转换构造函数(Converting Constructor),这个构造函数可以将参数类型转换成构造函数所在的类对应的类型。 **示例:** ```c++ class Complex { private: int i; int j; public: // 1. 普通构造函数 Complex(int i, int j) { this->i = i; this->j = j; } // 2. 转换构造函数 Complex(int i) { this->i = i; this->j = 0; } }; ``` **调用示例:** ```c++ Complex c = 5; ``` **转换构造函数会被调用,将整数 5 转换为 Complex 类型。** **注意:** * 如果没有显式转换构造函数,C++ 会使用隐式类型转换。 * 隐式类型转换只会发生在类型转换过程中,在构造函数调用之前。 * 为了禁用隐式类型转换,可以使用 `explicit`关键字在构造函数前面声明。

正文

在 C++ 中如果一个构造函数只有一个参数,那么这个构造函数就是转换构造函数(Converting Constructor),这个构造函数可以将参数类型转换成构造函数所在的类对应的类型。

举个例子,假设有如下类 Complex:

 1 class Complex {
 2 private:
 3     int i;
 4     int j;
 5 
 6 public:
 7    // 1. 普通构造函数
 8     Complex(int i, int j) {
 9         this->i = i;
10         this->j = j;
11     }
12 
13     // 2. 转换构造函数
14     Complex(int i) {
15         this->i = i;
16         this->j = 0;
17     }
18 };

上面代码注释2处就定义了一个转换构造函数,它可以将一个整数类型,转换成一个 Complex 类型。

假如有下面的调用:

// 此时会调用转换构造函数 Complex(5)
Complex c = 5;

那么转换构造函数就会被调用,将整数5转换成 Complex 类型,实际上等价于:

Complex c= Complex(5);

禁用隐式类型转换

上面的转换是编译器自动转换,称为隐式类型转换。如果不需要这种隐式类型转换,只需要在转换构造函数前面添加 explicit 关键字,如下所示:

 // 2. 转换构造函数
explicit Complex(int i) {
         this->i = i;
         this->j = 0;
     }

假如 explicit 之后,如果还进行如下调用编译器就会报错:

Complex c = 5; // 此时会报错

如果需要,仍然可以手动进行调用:

Complex c = Complex(5);

 

与C++ 转换构造函数相似的内容:

C++ 转换构造函数

C++ 转换构造函数

C# 使用模式匹配的好处,因为好用所以推荐~

类型检查和转换:当你需要检查对象是否为特定类型,并且希望在同一时间内将其转换为那个类型时,模式匹配提供了一种更简洁的方式来完成这一任务,避免了使用传统的as和is操作符后还需要进行额外的null检查。 复杂条件逻辑:在处理复杂的条件逻辑时,特别是涉及到多个条件和类型的情况下,使用模式匹配可以使代码更

C语言,实现数字谱到简谱的转换

C语言,实现数字谱到简谱的转换 前言:本文初编辑于2024年4月28日 CSDN:https://blog.csdn.net/rvdgdsva 博客园:https://www.cnblogs.com/hassle 前言 使用C语言实现了一个程序,能够将数字谱转变成简谱网站能够识别的格式,依靠简谱网站

C#.NET与JAVA互通之MD5哈希V2024

C#.NET与JAVA互通之MD5哈希V2024 配套视频: 要点: 1.计算MD5时,SDK自带的计算哈希(ComputeHash)方法,输入输出参数都是byte数组。就涉及到字符串转byte数组转换时,编码选择的问题。 2.输入参数,字符串转byte数组时,编码双方要统一,一般为:UTF-8。

C#.Net筑基-类型系统①基础

C#.Net的BCL提供了丰富的类型,最基础的是值类型、引用类型,而他们的共同(隐私)祖先是 System.Object(万物之源),所以任何类型都可以转换为Object。

static_cast与dynamic_cast到底是什么?

写这个随笔说一下C++的static_cast和dynamic_cast用在子类与父类的指针转换时的一些事宜。首先,【static_cast,dynamic_cast】【父类指针,子类指针】,两两一组,共有4种组合:用 static_cast 父类转子类、用 static_cast 子类转父类、使用

Json 基于类 Newtonsoft.Json.Linq.JToken 的应用简介【C# 基础】

在日常开发中,对于 Json 的使用还是比较频繁的,特别是 Json 对象和字符串或者实体对象之间的转换。今天一起来看下吧。

DateTime 相关的操作汇总【C# 基础】

关于协调世界时UTC、北京时间、本机时间,如何转成想要的格式,以及时间与时间戳互相转换,这里都有。

Boost程序库完全开发指南:1.2-C++基础知识点梳理

主要整理了N多年前(2010年)学习C++的时候开始总结的知识点,好长时间不写C++代码了,现在LLM量化和推理需要重新学习C++编程,看来出来混迟早要还的。 1.const_cast (expression)[1] 解析:const_cast转换符用来移除变量的const或v

使用Kettle定时从数据库A刷新数据到数据库B

# 一、需求背景 由于项目场景原因,需要将A库(MySQL)中的表a、表b、表c中的数据``定时T+1`` ``增量``的同步到B库(MySQL)。这里说明一下,不是数据库的主从备份,就是普通的数据同步。经过技术调研,发现Kettle挺合适的,原因如下: 1. Kettle (数据抽取、清洗、转换、