首页 > 编程语言 >explicit关键字【C++】

explicit关键字【C++】

时间:2024-11-26 15:14:13浏览次数:8  
标签:int explicit C++ month 关键字 year Date 构造函数

image

explicit关键字【C++】

用来修饰只有一个参数的类构造函数,以表明该构造函数是显式的,而非隐式的
禁止类对象之间的隐式转换,以及禁止隐式调用拷贝构造函数

隐式类型转换

int i = 1;
double d = i;

d被i赋值时
【编译器会做】
在中间产生一个临时变量
再通过这个临时对象进行拷贝构造给d

构造函数具有类型转换的作用

class Date
{
public:
// 构造函数
	Date(int year)
		:_year(year)    // 初始化列表
	{}

private:
	int _year;
	int _month = 3;
	int _day = 31;
};
int main()
{
    // d1 和 d2 都会调用构造函数
	Date d1(2022);
	Date d2 = 2023;
	return 0;
}

Date d2 = 2023;发生了隐式类型转换
image

如果做引用
Date& d3 = 2024;报错
image
原因:d3是一个Date类型,2024则是一个内置类型的数据

const Date d2 = 2023;可正常运行传值
原因:临时变量具有常性,它就是通过Date类的构造函数构造出来的,同类型之间可以做引用

explicit的作用:【禁止类型转换】

对于可读性不是很好的代码,可以使用explicit修饰构造函数,将会禁止构造函数的隐式转换,禁止隐式调用拷贝构造函数

只在类的构造函数前进行修饰

explicit Date(int year)
	:_year(year)
{}

const Date d2 = 2023;会报错

多参情况

Date(int year, int month ,int day = 31)
	:_year(year)
	,_month(month)
	,_day(day)
{}

这两种都可正常调用
Date d2 = { 2023, 3 };
const Date& d3 = { 2024, 4 };

若加入explicit

explicit Date(int year, int month ,int day = 31)
	:_year(year)
	,_month(month)
	,_day(day)
{}

则不可正常调用

标签:int,explicit,C++,month,关键字,year,Date,构造函数
From: https://www.cnblogs.com/whiteink/p/18570229

相关文章

  • C++练级计划->《多态》虚函数表,菱形继承多态
    目录什么是多态?多态的条件虚函数:虚函数的重写:协变 析构函数的重写C++11final和overridefinal:override:总结:三重对比:重载重写重定义对比抽象类多态的原理虚函数表为什么只能是父类的指针或者引用来调用才能形成多态? 动态绑定和静态绑定单继承的虚函数表 ......
  • C# 关键字
    修饰词关键字修饰词关键字是特定的关键字,指示谁可以修改类型和类型成员。修饰符允许或阻止程序的某些部分被其他部分修改。修饰词关键字abstractasyncconsteventexternnewoverridesealedstaticunsafevirtualvolatilereadonlypartialabstract抽象的abstract用于声明虚类,指......
  • 杨辉三角 c++
    第一种输出图形(直角三角形) #include<cstdio>#include<iostream>usingnamespacestd;voidyh(inta[10][10],intn){//定义n<10 for(inti=1;i<=n;i++){ for(intj=1;j<=n;j++){ if(i==j||j==1){//杨辉三角每行首尾都为1 a[i][j]=1; } elsea[i][......
  • C++,引用的讲解,本质,用法,注意事项
    1.引用的语法引用实际上就是给变量起别名,语法:数据类型&别名=原名,代码举例如下:#include<iostream>usingnamespacestd;intmain(){ inta=10; int&b=a; cout<<"a="<<a<<endl; cout<<"b="<<b<<end......
  • 树的双亲表示法与孩子表示法(C++源码)
    目录一、双亲表示法:二、孩子表示法:一、双亲表示法:#include<iostream>usingnamespacestd;#defineMAX_TREE_SIZE100template<typenameDataType>structPNode{ DataTypedata; intparent;};//树的存储结构:双亲表示法template<typenameDataType......
  • 打卡信奥刷题(309)用C++信奥P2614[普及组/提高] 计算器弹琴
    计算器弹琴题目描述总所周知,计算器可以拿来干很多它本不应该干的事情,比如写作文。(参看洛谷P2549)小A发现了一个计算器的另一个隐藏功能——弹琴。http://www.bilibili.com/video/av2205500/如果按上一个键,比如说1,就会发出中音“Do”。这边给出按键音高表+低音Fa<低......
  • C++子串计算
    内存限制:64MB时间限制:1.000S题目描述给出一个只包含0和1的字符串(长度在1到100之间),求其每一个子串出现的次数。输入一行,一个01字符串。输出对所有出现次数在1次以上的子串,输出该子串及出现次数,中间用单个空格隔开。按子串的字典序从小到大依次输出,每行一个。样例输入......
  • 什么是 C++ 中的类型别名和 using 声明? 如何使用类型别名和 using 声明?
    1)什么是C++中的类型别名和using声明?   在C++中,类型别名和using声明都是用于提高代码可读性和可维护性的工具。一、类型别名类型别名是给现有类型起一个新的名字。可以使用`typedef`关键字或者`using`关键字来定义类型别名。1.使用typedef:typedefin......
  • 什么是C++中的Lambda表达式?它的作用是什么?Lambda表达式可以捕获哪些类型的变量?有哪些
    什么是C++中的Lambda表达式?它的作用是什么?C++中的 Lambda 表达式: Lambda 表达式是 C++11 引入的一种匿名函数,可以在需要的地方直接定义并使用。通常的形式是[捕获列表](参数列表) -> 返回类型 { 函数体 }; 作用:简化代码:可以使代码更加简洁紧凑,避免定义单......
  • C++从零到进阶 ①.1顺序结构(例题+讲解)
    例题1 Hello,World!(难度评估:是人就会)❀考察点:基本输出注意:大小写输出标点 ⭐解题代码:#include<bits/stdc++.h>usingnamespacestd;intmain(){ cout<<"Hello,World!";//输出的文字字符等要用“”括起来 return0;} 例题2 A+B(难度评估:简简单单)❀考察点:简单......