C++显式构造函数和隐式构造函数

函数中参数的叫法:

  1. parameter一般认为叫参数;
  2. argument一般认为叫实参;
  3. 参数个数和实参个数是不一样的。
//对于A这么个类,有个构造函数
A(int a, int b, int c = 1)
	: a(m), b(n) {}

这里认为parameter参数需要3个,argument实参2个,3个肯定没问题(但是只要两个实参就够了)。

explicit关键字一般用在类的构造函数中,表示显式创建对象,编译器不能隐式转换构造。

见代码:

#include 
using namespace std;

class Fraction {
public:
	Fraction(int num, int den = 1)
		: m_numerator(num), m_denominator(den) {}

	/* 这是转换函数,如果有这个转换函数的话,会导致 ambiguous 二义性。
	operator double() const{
		return (double)m_numerator / (double)m_denominator;
	}
	*/

	double getValue() const{
		return (double)m_numerator / (double)m_denominator;
	}

	int getNumerator() const {
		return m_numerator;
	}

	int getDenominator() const {
		return m_denominator;
	}

	Fraction operator+(const Fraction& f) {
		return Fraction(
			this->getNumerator() + f.getNumerator(), 
			this->getDenominator() + f.getDenominator()
		);
	}

private:
	int m_numerator;	//分子
	int m_denominator;  //分母
};

int main(int argc, char** argv) {
	Fraction f(1, 2);
	Fraction res = f + 5; //编译器会显式地将 5 转换为 Fraction 类对象
	cout << res.getValue() << "\n\n";

	system("pause");
	return 0;
}

结果为:2.0

如果在构造函数前加个 explicit 。

C++显式构造函数和隐式构造函数_第1张图片
如果加了explicit,编译器不能执行隐式转化。

你可能感兴趣的:(c++/c,c++)