虽然消极期望功能的一部分,我们给它一个整数而不是。然而,由于分数具有构造函数的愿意接受一个整数,编译器将使用此构造函数隐式转换为整数6转化为分数的对象,然后将其复制到makenegative()初始化参数F.
因此,上面的程序打印:
6 / 1
这种隐式转换为各种初始化(直接、统一和复制)。
用于隐式会话的构造函数被称为转换构造函数(或转换构造函数)。C++ 11之前,只有一个参数的构造函数以可转换构造函数。然而,随着新的统一的初始化语法在C++ 11,这个限制被解除,并以多个参数的构造函数可以转换构造函数。
明确的关键词
因此,上面的程序打印:
6 / 1
这种隐式转换为各种初始化(直接、统一和复制)。
用于隐式会话的构造函数被称为转换构造函数(或转换构造函数)。C++ 11之前,只有一个参数的构造函数以可转换构造函数。然而,随着新的统一的初始化语法在C++ 11,这个限制被解除,并以多个参数的构造函数可以转换构造函数。
明确的关键词
虽然做隐式转换在分数的情况下是有意义的,在其他情况下,这可能是不可取的,或导致意想不到的行为:
#include <cassert>
#include <iostream>
class Fraction
{
private:
int m_numerator;
int m_denominator;
public:
// Default constructor
Fraction(int numerator=0, int denominator=1) :
m_numerator(numerator), m_denominator(denominator)
{
assert(denominator != 0);
}
// Copy constructor
Fraction(const Fraction ©) :
m_numerator(copy.m_numerator), m_denominator(copy.m_denominator)
{
// no need to check for a denominator of 0 here since copy must already be a valid Fraction
std::cout << "Copy constructor called\n"; // just to prove it works
}
friend std::ostream& operator<<(std::ostream& out, const Fraction &f1);
int getNumerator() { return m_numerator; }
void setNumerator(int numerator) { m_numerator = numerator; }
};
std::ostream& operator<<(std::ostream& out, const Fraction &f1)
{
out << f1.m_numerator << "/" << f1.m_denominator;
return out;
}
Fraction makeNegative(Fraction f) // ideally we should do this by const reference
{
f.setNumerator(-f.getNumerator());
return f;
}
int main()
{
std::cout << makeNegative(6); // note the integer here
return