首页 > 编程语言 >C++ 隐式转换与explicit关键字

C++ 隐式转换与explicit关键字

时间:2023-08-20 16:47:33浏览次数:37  
标签:string int explicit C++ Entity printEntity 隐式 构造函数

隐式转换与explicit关键字

隐式转换

函数构造的隐式转换,直接上代码:

#include<bits/stdc++.h>

class Entity {
private:
	std::string m_Name;
	int m_Age;
public:
	Entity(const std::string& name)
		: m_Name(name), m_Age(-1) {}
	Entity(int age) 
	:m_Name("Unknown"), m_Age(age) {}
};

void printEntity(Entity e) {
	// some code to print entity
	// ...
}

int main() {
	printEntity(18);
	printEntity("OrzMiku");
}

我有一个 Entity 类,有两个私有成员变量 string类 m_Nameint类型 m_Age 用来表示名称和年龄。

接着有两个不同版本的构造函数,注意,这两个构造函数都有且只有一个参数传入。这里重点mark一下

然后有一个打印实体的函数 printEntity ,这个函数需要一个 Entity 类作为参数。

正常来说,我们可以这样调用这个函数:

	printEntity(Entity(22));
	printEntity(Entity("OrzMiku"));

这里有一个常见的隐式转换,是将char数组转换成string类。

但是注意上面的代码中,是这样调用这个函数的:

	printEntity(18);
	printEntity("OrzMiku");

其中,第一句是正确的,第二句是错误的。

第一句中直接传入了一个 int 类型,函数需要一个 Entity 类型,在 Entity 类中有一个构造函数的参数只需要一个int类型,这时就可以发生隐式转换。将 int 作为参数隐式转换成一个 Entity 类型。

第二句中直接传入了一个 char 数组,但是在Entity类中没有构造函数的参数只需要一个 char 数组。虽然有一个构造函数需要一个 string ,但是 char 数组到 stringstringEntity 需要两次转换,所以不能隐式转换。

第二句可以改成这样:

printEntity(std::string("OrzMiku"));

同理,我们在创建Entity实例的时候,也就可以这样:

Entity a = 18;
Entity b = std::string("OrzMiku");

虽然在C++中可以这样写,但是还是推荐不使用这样的隐式转换,虽然有时可以让代码看起来更加简洁,但是我觉得会大大降低代码的可读性

explicit关键字

正如前面所说,不推荐使用隐式转化。explicit关键字就可以禁止隐式转化。

用explicit关键字修饰一个构造函数,就意味着这个构造函数没有隐式转化,必须显式调用这个构造函数。上代码:

#include<bits/stdc++.h>

class Entity {
private:
	std::string m_Name;
	int m_Age;
public:
	Entity(const std::string& name)
		: m_Name(name), m_Age(-1) {}
	explicit Entity(int age) 
	:m_Name("Unknown"), m_Age(age) {}
};

void printEntity(Entity e) {
	// some code to print entity
	// ...
}

int main() {
	printEntity(18);
	printEntity(std::string("OrzMiku"));
}

还是刚刚那个代码,有一点点小小的改动,我们将Entity的一个构造函数用explicit关键词修饰了。此时底下的 printEntity(18); 这行就报错了。因为不能用explicit修饰了其对应的构造函数,这个构造函数现在必须显式调用了。

所以这句代码写成这样就好了:printEntity(Entity(18);

标签:string,int,explicit,C++,Entity,printEntity,隐式,构造函数
From: https://www.cnblogs.com/orzmiku/p/17644216.html

相关文章

  • C++ Vector数组优化
    Vector数组优化问题这是一段没有优化的代码:#include<iostream>#include<vector>classEntity{public: intx,y;public: Entity(intx,inty) :x(x),y(y){} Entity(constEntity&e) :x(e.x),y(e.y){ std::cout<<"Copied!"<<st......
  • C++ 智能指针
    智能指针使用智能指针需要引入memory头文件unique_ptr#include<iostream>#include<string>#include<memory>classEntity{public: Entity(){ std::cout<<"CreatedEntity!"<<std::endl; } ~Entity(){ std::cout<<&q......
  • C++ 链接库
    C++中使用库分为两种,静态库和动态库。简单来说,静态库最后会被编译进二进制文件,动态库不会,需要二进制文件从外部载入。以下操作均在VisualStudio2022中进行,以32位GLFW为例子(glfw.org)。首先下载glfw32位的可执行程序。在解决方案目录创建一个Dependencies文件夹(名字无所谓),然后......
  • C++ 创建库并使用
    创建库并使用!>使用VisualStudio2022创建项目和解决方案首先创建一个空项目,这里叫Game,同时VisualStudio会帮你创建解决方案。这个项目是我们的应用程序。创建项目来存库!>以静态库为例、右键解决方案,添加新项目Engine。此时就有了两个项目,Game和Engine:打开E......
  • C++ 类
    类类是一种把数据和功能结合在一起的方法。使用class来定义一个类,像这样:classPlayer{//创建一个Player类intx=0,y=0;intspeed=1;};通过类创建一个对象(实例化),像这样:Playerplayer;成员变量可以使用点(.)来访问对象的属性。player.speed=2;但......
  • C++ 类和结构体内外的Static
    类和结构体外的Static这里的static指的是在类外的static,意味着你要声明的是static的符号,链接将只在内部。(换句话说作用域只在他所在的.cpp文件)。下面是几组例子来理解:例子1:main.cpp#include<iostream>usingnamespacestd;voidfun(){cout<<"fun()inmain.cpp"......
  • C++ 继承
    继承一个类可以继承另一个类,避免了代码复写。被继承的类被叫做基类,继承的类叫做派生类。(或者说是父类和子类)继承类型当一个类派生自基类,该基类可以被继承为public、protected或private几种类型。继承类型是通过上面讲解的访问修饰符access-specifier来指定的。我们几乎......
  • C++ 构造函数与析构函数
    构造函数和析构函数构造函数构造函数会在实例化对象的时候执行,可以在实例化时传入参数。构造函数没有返回值。不需要声明返回值。构造函数的函数名与类名保持一致。//classname:PlayerPlayer(intxa=0,intya=0){//构造函数,传入初始坐标进行初始化......
  • C++ 变量初始化总结
    堆空间,new操作初始化1、对于有自己写构造函数的类,不论类型名后面有没有括号()或者数组[],都用构造函数进行初始化,如果构造函数delete,则编译报错;2、如果没有构造函数,则不加括号的new只分配内存空间,不进行内存的初始化,3、而加了括号()的new会在分配内存的同时初始化为0。栈空间......
  • c++基础入门
    1.安装g++编译器是编译C++代码使用的编译器,不要使用gcc了。在用户目录中单独创建一个文件夹存放下载后的3个安装文件,然后进入到目录中执行下面命令cd文件夹sudodpkg-i*.deb本地安装sudoapt-getinstallg++在线安装2.C++的语言特点及优势cwithclass(类)cplusplus大型......