//// Created by light on 19-11-3.//#include <iostream>using namespace std;// non-explicit-one-argument ctorclass Fraction{public:// non-explicit-one-argument ctor 可以把别的东西转换为Fraction这种Fraction(int num, int den = 1) : m_numerator(num), m_denominator(den) {}Fraction operator+(const Fraction &f){return Fraction(this->m_numerator + f.m_numerator);}void getNumAndDen(){cout << m_numerator << " " << m_denominator << endl;}private:int m_numerator; // 分子int m_denominator; // 分母};// explicit-one-argument ctorclass Fraction1{public:// explicit-one-argument ctor 可以把别的东西转换为Fraction这种explicit Fraction1(int num, int den = 1) : m_numerator(num), m_denominator(den) {}Fraction1 operator+(const Fraction1 &f){return Fraction1(this->m_numerator + f.m_numerator);}void getNumAndDen(){cout << m_numerator << " " << m_denominator << endl;}private:int m_numerator; // 分子int m_denominator; // 分母};class P{public:P(int a, int b){cout << "P(int a,int b)\n";}P(int a, int b, int c){cout << "non-explicit P(int a,int b,int c)\n";}explicit P(int a, int b, int c, int d){cout << "explicit P(int a,int b,int c,int d)\n";}};void fp(const P &){}int main(){Fraction f(3, 5);Fraction ff = f + 3; // 会将3转换为(3,1) 隐式转换ff.getNumAndDen();// 如果不想编译器进行隐式转换,可以在前面添加explicit关键字// c++2.0之前explicit只禁止"存在单一实参"转换// c++2.0之后explicit可以进制"多个实参"转换// Fraction1 f1(3,5);// Fraction1 f2 = f1+3; // 会将3转换为(3,1) 不会隐式转换 error: no match for ‘operator+’ (operand types are ‘Fraction1’ and ‘int’)// f2.getNumAndDen();P p1 = {77, 5};P p2 = {77, 5, 89};// P p3 = {77, 5, 89,99}; //error: converting to ‘P’ from initializer list would use explicit constructor ‘P::P(int, int, int, int)’return 0;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。