C++之explicit关键字使用总结

来源:互联网 发布:玉米田间调查数据 编辑:程序博客网 时间:2024/06/06 00:24

1、explicit关键字介绍

C++中的explicit关键字只能用于修饰只有一个参数类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).



2、贴代码

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>using namespace std;class Stest{   public:      char *_pstr;      int _size;//      explicit Stest(int size)      Stest(int size)      {          _size = size;          _pstr =(char *)malloc(size + 1);          memset(_pstr, 0, size + 1);      }      Stest(const char* p)      {         int size = strlen(p);         cout<<"size"<<size<<endl;         _pstr = (char *)malloc(size + 1);         strcpy(_pstr, p);         _size = strlen(_pstr);         cout<<"_size"<<size<<endl;     }};int main(){    Stest s;    Stest s1(30);    Stest s2 = 5;    Stest s3("chenyu");    Stest s4 = 'a';    Stest s5 = s3;    return 0;}


3、分析代码

1)在构造方法Stest(int size)前面没有加上explicit时,结果如下

    Stest s;            //fail    Stest s1(30);       //success    Stest s2 = 5;       //success    Stest s3("chenyu"); //success    Stest s4 = 'a';     //success    Stest s5 = s3;      //success
Stest s是由于没有定义默认的构造函数

Stest s2 = 5能执行成功是因为在C++中, 如果的构造函数只有一个参数时, 那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象. 也就是说 "Stest string2 = 10;" 这段代码, 编译器自动将整型转换为CxString类对象, 实际上等同于下面的操作:

    Stest s2(5);      或      Stest temp(5);      Stest s2 = temp;  

'a'实际也是一个数字

2)在构造方法Stest(int size)前面加上explicit时,结果如下

    Stest s;            //fail    Stest s1(30);       //success    Stest s2 = 5;       //fail    Stest s3("chenyu"); //success    Stest s4 = 'a';     //fail    Stest s5 = s3;      //success

explicit关键字的作用就是防止类构造函数隐式自动转换.

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

Stest(int size, int money)

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

Stest(int size, int money = 0)








0 0
原创粉丝点击