【C++】详谈explicit关键字背后的隐式类型转换和编译器优化

本文深入探讨了C++中explicit关键字的作用,它用于禁止构造函数的隐式转换。通过实验,作者揭示了explicit关键字如何影响单参数构造函数和拷贝构造函数的使用,并分析了编译器优化(Copy Elision)在其中的影响。文章通过不同场景的代码示例,展示了explicit关键字如何防止隐式类型转换和拷贝初始化,并讨论了编译器优化在某些情况下可能改变程序行为的现象。

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

开场白

本来想总结一下explicit关键字的用法,结果看了官方文档发现能给拷贝构造加explicit,我就去试了试

试了之后,又发现了两个大坑:隐式类型转换和编译器优化,本来我以为我很久以前就理解了这俩概念,但是一系列实验结果表明这并不是那么简单

这两个坑折磨得我欲仙欲死

首先贴一下我们一直说的编译器优化是什么,官网的定义

编译器优化学名叫:拷贝省略

Copy elision
Omits copy and move (since C++11) constructors, resulting in zero-copy pass-by-value semantics.
The compilers are required to omit the copy and move construction of class objects

注意,本博客基于VS2019进行实验

前言

相比于C语言的32个关键字,C++98开始陆续增加了很多C++关键字使得C++的新特性越来越多

我们今天来谈谈C++98增加的explicit关键字

根据以前的理解,在单参数构造函数之前加explicit会导致我们不能使用隐式类型转换的方式去实例化对象

那么我们来看一看官方文档是怎么说的

目录

explicit的功能

根据官方文档 https://en.cppreference.com/w/cpp/language/explicit

explicit的作用是:

Specifies that a constructor or conversion function (since C++11) or deduction guide (since C++17) is explicit, that is, it cannot be used for implicit conversions and copy-initialization.

A constructor with a single non-default parameter (until C++11) that is declared without the function specifier explicit is called a converting constructor.

意思是用explicit修饰了构造函数后,就不支持隐式的转换拷贝初始化

不支持隐式类型转换我可以理解,那么不支持拷贝构造是什么意思呢?
(事后来看,我英文没看懂,而且没有明白隐式类型转换的真正含义。)

这句话的真正意思是:explicit关键字能让构造函数不可被隐式地调用, implicit conversions指的是隐式地用单个参数构造一个对象,copy-initialization指的是隐式地调用拷贝构造,用一个对象构造另一个对象

也就是说这两种构造对象的隐式调用都能被explicit禁!

但事情远没这么简单

代码研究

我们简单模拟了一个my_string的类,给了`单参构造和拷贝构造`
class my_string {
   
public:
	my_string(const char* str) {
   
		size_t len = strlen(str);
		_str = new char[len  + 1];
		memcpy(_str, str, len + 1);
		_size = _capacity = len;
	}
	my_string(const my_string& str) {
   
	size_t len = strlen(str._str);
	_str = new char[len + 1];
	memcpy(_str, str._str, len + 1);
	_size = _capacity = len;
private<
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DanteIoVeYou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值