关键字explicit学习

1. 初始化表达式

在了解explicit之前,看一段代码

#include <iostream>
using namespace std;

class Test1
{
public :
	Test1(int a1):a(a1){}
private:
	int a;

};

int main()
{
	Test1 t1 = 12;
	Test1 t2(13);

		
	return 0;
}

这段代码中Test1构造函数的声明用的冒号表示的是初始化表达式

参考连接:

C++构造函数后面的冒号_kaixinbingju的专栏-CSDN博客_构造函数后面的冒号

Test1(int a1):a(a1){}    

相当于

Test (int a1) {

a = a1;

需要注意的是,这种初始化方式在以下四种情况下使用:

初始化const成员
初始化引用成员
当调用基类的构造函数,而它拥有一组参数时。

当调用成员类的构造函数,而它拥有一组参数时。

这样是有好处的,有的数据成员需要在构造函数调入之后函数体执行之前就进行初始化如引用数据成员,常量数据成员和对象数据成员。

如果在其他情况下使用,

例如:

#include <iostream>
using namespace std;
void test(int a):a1(a) {};
 

int main()
{
		
	return 0;
}

报错error: only constructors take member initializers. 

2. explicit与隐式转换注意事项

首先看一下这段代码

#include <iostream>
using namespace std;
class Test1
{
    public :
        Test1(int a1):a(a1){
            cout << "a: " << a << endl;
        }
    private:
        int a;

};

int main()
{
	Test1 t1 = 12;  //隐式转换
	Test1 t2(13);   //赋值
	return 0;
}

构造函数可以通过两种赋值方式进行初始化,方式是隐式转换赋值

分别是 Test1 t1 = 12;  和  Test1 t2(13); 的方式,两者等价。

参考链接

c++中的explicit与隐式转换注意事项(错误代码:conversion from ‘int‘ to non-scalar type ‘Date‘ requested)_堺雅人v的博客-CSDN博客

3. 防止隐式转换explicit

 explicit关键字的作用就是防止类构造函数的隐式自动转换.
上面也已经说过了, explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了.

但是, 也有一个例外, 就是当除了第一个参数以外的其他参数都有默认值的时候, explicit关键字依然有效, 此时, 当调用构造函数时只传入一个参数, 等效于只有一个参数的类构造函数,。

参考链接

C++ explicit关键字详解_天空的博客-CSDN博客_explicit

#include <iostream>
using namespace std;
class Test1
{
    public :
        Test1(int a1):a(a1){
            cout << "a: " << a << endl;
        }
    private:
        int a;

};

class Test2
{
    public :
        explicit Test2(int num):n(num){}
    private:
        int n;
};

 

int main()
{
	Test1 t1(13);
    Test2 t2(14);
	Test2 t3 = 14;  //报错 加了关键字explicit,不能隐式转换。
	return 0;
}

意义:

class Date
{
int date;

public:
Date(int da=0):da(date) {}
~Date() {}
}

//若构造函数只含有一个参数,且这个参数的类型不同于本类,那么这个函数即为转换构造函数
//初始化时可以
int da=100;
Date date(da);//right
Date date=da; //right 自动将int类变量转换成Date类对象.
//若在构造函数前加explicit关键词,则构造函数只具有为对象初始化能力,不具备转换功能.
class Date
{
int date;

public:
explict Date(int da=0):da(date) {}
~Date() {}
}

Date date(da);//right
Date date=da; //wrong

参考链接

explicit关键字含义-CSDN论坛

4. 总结

  当构造函数只有一个参数时,为了防止类构造函数的隐式自动转换,使用explicit关键字进行限制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在引用的内容中,并没有提到explicit关键字可以直接修饰拷贝构造函数。explicit关键字通常用于修饰类的构造函数,以防止隐式类型转换。在C++中,拷贝构造函数是一个特殊的构造函数,用于创建对象的副本。通常情况下,拷贝构造函数不会被explicit关键字修饰。所以,如果要强制禁止隐式调用拷贝构造函数,可以使用其他的方法,例如将拷贝构造函数声明为私有或删除该函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [explicit作用,拷贝构造函数,隐式类型](https://blog.csdn.net/NBE999/article/details/77881518)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【C++学习explicit修饰构造函数](https://blog.csdn.net/TwT520Ly/article/details/80974757)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [c/c++拷贝构造函数和关键字explicit详解](https://download.csdn.net/download/weixin_38548589/13994418)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值