首先是个这样的小数的例子,没加explicit看看是什么情况:
创新互联专注于企业营销型网站建设、网站重做改版、藤县网站定制设计、自适应品牌网站建设、HTML5建站、商城网站建设、集团公司官网建设、成都外贸网站建设公司、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为藤县等各大城市提供网站开发制作服务。类:
//
// Created by 浅笑 on 2022/11/28.
//
#ifndef CLION_PJ_FRACTION_H
#define CLION_PJ_FRACTION_H
class Fraction{
public:
Fraction(int num,int den=1):m_numerator(num),m_denominator(den){}
Fraction operator+(const Fraction& f);
operator double() const {
return (double)m_numerator / m_denominator;
}
private:
int m_numerator;
int m_denominator;
friend int gcd(const Fraction& f1, const Fraction f2);
};
int gcd(const Fraction& f1, const Fraction f2){
int m=f1.m_numerator*f2.m_denominator+f1.m_denominator*f2.m_numerator;
int n=f1.m_denominator*f2.m_denominator;
int r;
while (n!=0){
r=m%n;
m=n;
n=r;
}
// std::cout<
测试如下:
#include#include#include#include#include#include
#include#include#include
之后就炸了:
这里说噢,有二义性:
1.这里的f+4可以用Fraction的+运算符的重载,而这里的操作就是先把4.0由构造函数转变成Fraction类,再用重载的操作符计算。
2.也可以用double的+运算符,操作就是先直接把Fraction用double操作符转过去,再用+号计算,那么我们到底用哪个呢?不知道。
然后我们给类的构造函数加上explicit再测试一次:
explicit Fraction(int num,int den=1):m_numerator(num),m_denominator(den){}
又炸了,不过这次他说的是没有给可见的从double到Fraction的转换,显式的构造函数不是一个候选项,说明啥,我们在加了explicit之后,编译器式不会隐式调用构造函数的!所以这里是两个double相加,那么最后要从double到Fraction,我们就要显式地加上一个构造的函数。
将测试修改如下:
int main()
{
Fraction f(3,5);
cout<<(double)f<结果如下所示:
那为啥不Fraction(f+4.0)呢,由于两个数据是int的,所以在初始化的时候把小数给抹去了sos。不过关键还是理解explicit辣!
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
分享名称:侯捷C++复现:explicit在构造函数中-创新互联
路径分享:http://cdkjz.cn/article/ccdhcd.html