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++ 转换构造函数

static_cast与dynamic_cast到底是什么?

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

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

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

极速进化,光速转录,C++版本人工智能实时语音转文字(字幕/语音识别)Whisper.cpp实践

业界良心OpenAI开源的Whisper模型是开源语音转文字领域的执牛耳者,白璧微瑕之处在于无法通过苹果M芯片优化转录效率,Whisper.cpp 则是 Whisper 模型的 C/C++ 移植版本,它具有无依赖项、内存使用量低等特点,重要的是增加了 Core ML 支持,完美适配苹果M系列芯片。

[转帖]C++:perf详解 + Flame Graph火焰图分析程序性能

因为项目需求,C++和java同时在搞,最近了解到Flame Graph火焰图这个工具,网上查了查资料,这里记录一下。 1 介绍 web site http://www.brendangregg.com/flamegraphs.html git: https://github.com/brendan

[转帖]「理解C++20协程原理」从Linux线程、线程与异步编程、协程与异步

协程不是系统级线程,很多时候协程被称为“轻量级线程”、“微线程”、“纤程(fiber)”等。简单来说可以认为协程是线程里不同的函数,这些函数之间可以相互快速切换。 协程和用户态线程非常接近,用户态线程之间的切换不需要陷入内核,但部分操作系统中用户态线程的切换需要内核态线程的辅助。 协程是编程语言(或

[转帖]文文的复习笔记--底层内存管理

内存分配方式: c++中,内存分成五个区: 堆:new分配执行的内存块,一个new一个delete。 栈:执行函数,局部变量的存储单元在栈上创建,执行结束存储单元自动释放。 自由存储区:由malloc分配的内存块,和堆相似,用free结束自己的生命。 全局/静态存储区:全局变量和静态变量被分配到这一

[转帖]【JVM】Java内存区域与OOM

引入 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。 Java虚拟机运行时数据区 如图所示 1.程序计数器(线程私有) 作用 记录当前线程所执行到的字节码的行号。字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节

[转帖]【JVM】Java内存区域与OOM

引入 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。 Java虚拟机运行时数据区 如图所示 1.程序计数器(线程私有) 作用 记录当前线程所执行到的字节码的行号。字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节

[转帖]【JVM】GC算法与垃圾收集器

引入 java 语言中一个显著的特点就是引入了java回收机制,是c++程序员最头疼的内存管理的问题迎刃而解,它使得java程序员在编写程序的时候不在考虑内存管理。由于有个垃圾回收机制,可以有效的防止内存泄露,有效的使用空闲的内存; 内存泄露:指该内存空间使用完毕后未回收,在不涉及复杂数据结构的一般