explicti 关键字

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

#include <iostream>
using namespace std;class A

{
 public:
  int val;
  char* p;
  A(int x){
    val = x;
    cout<<"1"<<" "<<val<<endl;
  }
  A(char* q){
    p = q;
    cout<<"2"<<" "<<*q<<endl;
  }
};

int main(){
    A a1(3); // 1 3
    A a2("iiii"); // 2 i
    A a3 = 4; // 1 4
    A a4 ='c'; // 1 99   
}

/******************************************/

用了关键字后

#include <iostream>
using namespace std;class A

{
 public:
  int val;
  char* p;
  explicit A(int x){
    val = x;
    cout<<"1"<<" "<<val<<endl;
  }
  A(char* q){
    p = q;
    cout<<"2"<<" "<<*q<<endl;
  }
};

int main(){
    A a1(3); // 1 3
    A a2("iiii"); // 2 i
  //  A a3 = 4; // 1 4
  //  A a4 ='c'; // 1 99   
}

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

/************************************************************/

在上面说了explicit关键字用于一个参数的类构造函数,如果对于多个参数的呢

#include <iostream>
using namespace std;

class A
{
public:
  int val;
  char* p;
  explicit A(int x,int y){
    val = x;
    cout<<"1"<<" "<<val<<" "<<y<<endl;
  }
  A(char* q){
    p = q;
    cout<<"2"<<" "<<*q<<endl;
  }
};

int main(){
  A a1(3,'c'); // 1 3 99
  //A a2("iiii"); // 2 i
  // A a3 = 4; // 1 4
  // A a4 ='c'; // 1 99
}

是无效的,但当除了第一个参数,其他参数是默认值,又是有效的

explicit A(int x,int y=10,bool t=true)

 

posted on 2018-07-26 20:54  hhhhx  阅读(117)  评论(0)    收藏  举报

导航