GeekBand c++學習筆記之四(conversion fuction vs non-explicit-one-arguement ctor)

本文探讨了C++中类型转换的两种方法:转换函数(conversion function)与非显式单参数构造函数(non-explicit one-argument constructor)。通过具体实例展示了两者的工作原理及其区别,强调了在实际应用中正确选择的重要性。

大家好,因為這一周所講述的課程點比較分散,所以我就記錄與分享一下我比較深刻與個人覺得比較有趣的部份,這個部分就conversion fuction和non-explicit-one-arguement ctor,為甚麼我覺得這兩個特別有意思,因為我覺得可以看見不同的類型變數依自己設計的函數變換類型,再做兩者的運算特別有意思,而non-explicit-one-arguement ctor也是如此,兩者相當相似,但也不同,會使人混亂,但也很有趣,所以向大家介紹

conversion fuction:

<span style="font-size:18px;"><span style="font-size:18px;">class Franction
{
public:
  Franction(int num,int den=1):m_numerator(num),m_denominator(den){}
  operator double()const{
    return (double)(m_numerator/m_denominator);
  }
private:
  int m_numerator;
  int m_denominator;
};
int main()
{
  Franction f(3,5);
  double d=4+f;
  return 0;
 }</span></span>

這是個轉換函數,他是如何運作的呢!我們從測試端看,double d=4+f,我們先看d被定為double類型,但是4是int型,而f是Franction型,所以三者都是不同的,但是run時,卻已經把他們的類型都轉了,因為在創建d的時候,operator () const函數作用了,而他的轉換類型也由我們設計好的傳換到double型,4也同時被轉換為double,所以double d才沒有錯誤的創建

non-explicit-one-arguement ctor:

<span style="font-size:18px;"><span style="font-size:18px;">class Franction
{
public:
  Franction(int num,int den=1)
  :m_numerator(num),m_denominator(den){}
  Franction operator +(const Franction&f)
  {
  	return Franction(...);
  }
private:
  int m_numerator;
  int m_denominator; 
};
int main()
{
  Franction f(3,1);
  Franction d=f+4;
	return 0;
 }</span></span>

可以看到其實跟conversion fuction是有類似的地方,先來解釋他的ctor為何為non-explicit-one-arguement,因為在他的函數前沒有加上explicit,而one-arguement是因為他已經有一個餐是以經是有默認值了,但是你可以說跟前者的ctor相同,但是他們的轉換方式不同,以至於他們的函數表現也不同,先看non-explicit-one-arguement ctor的設計端,在Franction d=f+4,d是Franction型,4是int型,f是Franction型,他在run時是這樣做的,先調用non-explicit-one-arguement ctor把4轉為Franction型就是Franction(4,1),這樣就不會出錯

這樣看起來,似乎兩者都是轉換函數,但是兩者也是相當的矛盾的,如下

conversion fuction vs non-explicit-one-arguement ctor

<span style="font-size:18px;">class Franction
{
public:
  Franction(int num,int den=1)
  :m_numerator(num),m_denominator(den){}
  operator double()const{
    return (double)(m_numerator/denominator);
  }
  Franction operator +(const Franction)
  {
  	return Franction(...);
  }
private:
  int m_numerator;
  int m_denominator; 
};
Franction f(3,5);
Franction d2=f+4;//[error]ambiguous </span>

這裡編譯氣就會發生錯誤,其會顯示[error]ambiguous,這是什麼意思呢!是引起歧意的意思,引起歧意,因為compiler做不出抉擇,因為有兩個方式run

1.Franction d2=f+4;會將4轉為double,operator (double)作用

2.Franction d2=f+4;會將4轉為Franction,Franction operator作用

所以在轉換上要選擇好用哪種方法,不然會錯誤







「LLM那些事」系列第 4 篇《上下文窗口的边界》,文章连接:https://blog.csdn.net/houwenjin/article/details/163999753。 演示什么:在「预测」Sheet 的黄色格子里输入一句话(默认「来泡一杯」),个「模型」——分别只统计最后 1 / 2 / 3 / 4 个字的 n-gram 查表——同时预测下一个字。同一个输入,看的上下文越长,候选越少、预测越确定: ┌────────────────┬──────────┬───────────────┬──────┐ │ 只看最后几个字 │ 用的前缀 │ 候选下一字数 │ 预测 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 1 个 │ 杯 │ 3(茶/子/水) │ 模糊 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 2 个 │ 一杯 │ 2(茶/水) │ 收窄 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 3 个 │ 泡一杯 │ 1(茶) │ 确定 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 4 个 │ 来泡一杯 │ 1(茶) │ 确定 │ └────────────────┴──────────┴───────────────┴──────┘
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 笔记本的散热风扇管理 ---------------------------------------- 09 November 2006. 对于版本20061109的变更概述如下: 1) ACPI CA核心子系统:在源操作数是一个操作区域的场景下,对负载ASL操作符进行了优化。仅需映射操作区域内存,而不是执行逐字节读取。 (区域必须为SystemMemory类型,见下文。)修正了源操作数为区域字段的负载ASL操作符问题。也允许缓冲区对象作为源操作数。 BZ 480 解决了负载ASL操作符允许源操作数为任意类型操作区域的问题。现被限制为仅SystemMemory类型的区域,符合ACPI规范。 BZ 481 对新表管理器代码进行了额外的清理和优化。AcpiEnable将在所有必需的ACPI表未加载时失败(FADT, FACS, DSDT)。 BZ 477 在acobject.h中添加了#pragma pack(8/4),以确保此头文件中的结构始终编译为对齐。ACPI_OPERAND_OBJECT已被手动优化为对齐,并在字节打包时无法工作。示例代码和数据大小:这些是Microsoft Visual C++ 6.0 32位编译器生成的、与操作系统无关的acpica.lib的大小。调试版本的代码包含调试输出跟踪机制,具有更大的代码和数据大小。上一个版本:非调试版本:78.1K代码,17.1K数据,95.2K总计 调试版本:155.4K代码,63.1K数据,218.5K总计 当前版本:非调试版本:77.9K代码,17.0K数据,94.9K总计 调试版本:155.2K代码,63.1K数据,...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值