C++ explicit关键字

本文探讨了C++中构造函数如何定义隐式转换机制,通过实例展示了单参数构造函数如何允许类型转换。同时,解释了`explicit`关键字的作用,用于禁止这种隐式转换,以及其在多参数构造函数中的应用条件。最后,提到了一种特殊情况,即使构造函数有多个参数但其余参数有默认值,`explicit`关键字仍然生效。

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

1、如果构造函数只接受一个实参,则他实际上定义了转换为此类类型的隐式转换机制(即implicit),经常见的例子如下:

string s("flag");    //调用string 只有一个实参的构造函数

string s = "falg";   //也可以,此时实际的操作就是:

                           // string temp("flag");     s = temp;(拷贝)

2、显示声明的构造函数和隐式声明的区别如下:

(1)如下隐式声明的情况

#include <iostream>
using namespace std;

struct student
{
    student(string s) : name(s){}
    
    //student(const char* p);
    
    string name;
};

int main() {
    
    student s1("alen");
    cout << s1.name << endl;   //可以正常打印,const char*类型隐式的转换为了string类型
    
    //student s = "jams";         //编译失败,因为入参是string类型,此处的char* 并不会转换为string类型   
    
    string str = "jams";       //所以需要将char* 声明为string
    student s2 = str; 
    cout << s2.name << endl;   // 可以正常打印,因为所调用构造函数,只接受一个参数,提供了隐式转换机制
    return 0;
}

(2)如果不想让用隐式转换的情况,可以使用explicit关键字。explicit关键字的作用就是防止类构造函数的隐式自动转换.

#include <iostream>
using namespace std;

struct student
{
    explicit student(string s) : name(s){}
    
    string name;
};

int main() {
    
    student s1("alen");
    cout << s1.name << endl;   //可以正常打印,const char*类型隐式的转换为了string类型
    
    string str = "jams";       //所以需要将char* 声明为string
    student s2 = str;          //编译失败,因为explicit关键字限制了隐式转换。
    cout << s2.name << endl;   
    return 0;
}

(3)explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了. 

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

#include <iostream>
using namespace std;

struct student
{
    student(string s,int a = 15) : name(s), age(a){}
    
    string name;
    int age;
};

int main() {
    
    student s1("alen");
    cout << s1.name << endl;   //可以正常打印,const char*类型隐式的转换为了string类型
    
    string str = "jams";       //所以需要将char* 声明为string
    student s2 = str;          //编译成功,因为除了第一个参数以外都有默认值。
                               //当调用构造函数时只传入一个参数,等效于只有一个参数的类构造函数
    cout << s2.name << endl;   
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值