zoukankan      html  css  js  c++  java
  • C++之explicit关键字

    C++ 语言可以定义如何将其他类型的对象隐式转换为我们的类类型, 或将我们的类类型的对象隐式转换为其他类型。

    #include <iostream>
    using namespace std;
    
    class A
    
    {
    
    public:
    
    	A(int temp) //普通构造函数
    
    	{
    
    		a = temp;
    
    		cout << "普通构造函数: a= " << a << endl;
    
    	}
    
    	
    
    	A(const A &temp) //拷贝构造函数
    
    	{
    
    		a = temp.a;
    		cout << "拷贝构造函数: a = " << a << endl;
    
    	}
    
    
    private:
    
    	int a;
    
    };
    
     
    
    int main()
    
    {
    	cout << "显示调用:" << endl;
    
    	A a(250); //显式调用调用普通构造函数,ok
    
    	A b(a);   //显式调用调用拷贝构造函数,ok
    
    	cout << "
    隐式转换:" << endl;
    
    	A c=222; //隐式转换成调用普通构造函数,ok
    
    	A d=c;   //隐式转换成调用拷贝构造函数,ok
    
    	return 0;	
    
    }
    

    问题:如果要避免这种自动转换的功能,我们该怎么做呢?C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。


    解析:c++中的explicit关键字抑制由构造函数定义的隐式转换。explicit关键字只能用于类内部的构造函数声明上。在类的定义体外部所做的定义上不要加explicit关键字。

    #include <iostream>
    
    using namespace std;
    
    class A
    
    {
    
    public:
    
    	explicit A(int temp) //普通构造函数,被声明为explicit(显式)
    
    	{
    
    		a = temp;
    
    		cout << "普通构造函数: a= " << a << endl;
    
    	}
    
    	
    
    	explicit A(const A &temp) //拷贝构造函数,被声明为explicit(显式)
    
    	{
    
    		a = temp.a;
    
    		cout << "拷贝构造函数: a = " << a << endl;
    
    	}
    
    	
    
    private:
    
    	int a;
    
    };
    
     
    
    int main()
    
    {
    
    	cout << "显示调用:" << endl;
    
    	A a(250); //显式调用调用普通构造函数,ok
    
    	A b(a);   //显式调用调用拷贝构造函数,ok
    
    	
    
    	//explicit构造函数只能被显式调用
    
    	A c=222; //不能通过隐式转换,error
    
    	A d=c;   //不能通过隐式转换,error
    
     
    
    	return 0;	
    
    }
    

    总结:
    普通构造函数能够被隐式调用。而explicit构造函数只能被显式调用。


    通常,除非有明显的理由想要定义隐式转换,否则,单形参构造函数应该为 explicit。将构造函数设置为explicit可以避免错误,并且当转换有用时,用户可以显式地构造对象。

  • 相关阅读:
    URAL 1018 Binary Apple Tree
    URAL 1029 Ministry
    URAL 1039 Anniversary Party
    URAL 1078 Segments
    Codeforces 918D
    Codeforces 918C
    URAL 1495 One-two, One-two 2
    URAL 1244 Gentlemen
    URAL 1658 Sum of Digits
    URAL 1081 Binary Lexicographic Sequence
  • 原文地址:https://www.cnblogs.com/retry/p/9332382.html
Copyright © 2011-2022 走看看