在 C++ 中使用显式关键字

C++ 中的显式关键字用于标记构造函数以不隐式转换 C++ 中的类型。对于只接受一个参数并适用于构造函数(带有单个参数)的构造函数,它是可选的,因为它们是唯一可用于类型转换的构造函数。

让我们通过一个例子来理解显式关键字。

预测以下 C++ 程序的输出

// CPP Program to illustrate default
// constructor without 'explicit'
// keyword
#include <iostream>
using namespace std;

class Complex {
private:
	double real;
	double imag;

public:
	// Default constructor
	Complex(double r = 0.0, double i = 0.0)
		: real(r)
		, imag(i)
	{
	}

	// A method to compare two Complex numbers
	bool operator==(Complex rhs)
	{
		return (real == rhs.real && imag == rhs.imag)
				? true
				: false;
	}
};

// Driver Code
int main()
{
	// a Complex object
	Complex com1(3.0, 0.0);

	if (com1 == 3.0)
		cout << "Same";
	else
		cout << "Not Same";
	return 0;
}

输出

相同的

正如本文所讨论的在 C++ 中,如果一个类有一个可以用单个参数调用的构造函数,那么这个构造函数就成为转换构造函数,因为这样的构造函数允许将单个参数转换为正在构造的类。

我们可以避免这种隐式转换,因为这些可能会导致意想不到的结果***。*** 我们可以借助显式关键字使构造函数显式化。例如,如果我们尝试使用带有构造函数的显式关键字的以下程序,则会出现编译错误。

// CPP Program to illustrate default
// constructor with
// 'explicit' keyword
#include <iostream>
using namespace std;

class Complex {
private:
	double real;
	double imag;

public:
	// Default constructor
	explicit Complex(double r = 0.0, double i = 0.0)
		: real(r)
		, imag(i)
	{
	}

	// A method to compare two Complex numbers
	bool operator==(Complex rhs)
	{
		return (real == rhs.real && imag == rhs.imag)
				? true
				: false;
	}
};

// Driver Code
int main()
{
	// a Complex object
	Complex com1(3.0, 0.0);

	if (com1 == 3.0)
		cout << "Same";
	else
		cout << "Not Same";
	return 0;
}

输出

编译器错误:'com1 == 3.0e+0' 中的 'operator==' 不匹配

我们仍然可以将 double 值类型转换为 Complex,但现在我们必须显式地对其进行类型转换。例如,以下程序可以正常工作。

// CPP Program to illustrate
// default constructor with
// 'explicit' keyword
#include <iostream>
using namespace std;

class Complex {
private:
	double real;
	double imag;

public:
	// Default constructor
	explicit Complex(double r = 0.0, double i = 0.0)
		: real(r)
		, imag(i)
	{
	}

	// A method to compare two Complex numbers
	bool operator==(Complex rhs)
	{
		return (real == rhs.real && imag == rhs.imag)
				? true
				: false;
	}
};

// Driver Code
int main()
{
	// a Complex object
	Complex com1(3.0, 0.0);

	if (com1 == (Complex)3.0)
		cout << "Same";
	else
		cout << "Not Same";
	return 0;
}

输出

相同的

**注意:**显式说明符可以与常量表达式一起使用。但是,如果该常量表达式的计算结果为真,那么只有函数是显式的。

上一篇:什么是java,java工程师应该具备哪些能力?


下一篇:HTTP协议—x-forwarded-for&x-real-ip