【发布时间】:2015-11-11 03:15:48
【问题描述】:
我正在研究 C++ 中的转换构造函数和转换运算符。
到目前为止,我学到的是,任何只接受一个参数(以及任意数量的可选默认参数)的非显式构造函数都表示隐式类类型转换为 THAT 类类型,例如,如果一个类定义了一个具有int 类型的一个参数我可以在需要该类类型的对象的任何地方使用int:
(假设 class_type 有一个重载的 += 运算符)
class_type a;
a+=5;
在这种情况下,5 被隐式转换(通过转换构造函数)为class_type,并调用重载运算符。
现在,(至少对我而言)棘手的部分:我知道我可以将转换运算符定义为成员函数:
operator int() {....};
将class_type 的对象转换为基本的int 类型,我可以像这样使用这种转换:
class_type a;
a+5;
在这种情况下,我读到该对象通过其转换运算符转换为 int,然后调用内置求和运算符。 但是,如果我定义了一个重载的 + 运算符以将两个 class_type 对象作为其参数呢?像
class_type operator+(const class_type&,const class_type &c);
编译器应该如何知道通过函数匹配调用哪一个?
到int 的转换是否仅在仅定义内置运算符时才隐式发生?
谢谢!
编辑:
实际上,我已经尝试编写一些代码来有效地尝试一下,结果我的编译器 (g++) 没有发出任何模棱两可的调用错误!
这是类头(连同非成员操作符+函数声明):
#include <iostream>
class wrapper {
friend std::ostream &operator<<(std::ostream&,const wrapper&);
public:
wrapper()=default;
wrapper(int);
int get();
operator int() const;
wrapper operator+(int);
private:
int a=10;
};
std::ostream &operator<<(std::ostream&,const wrapper&);
这是主要代码:
#include "wrapper.h"
int main()
{
using namespace std;
wrapper w1;
wrapper w2(5);
cout<<w1<<" "<<w2<<endl;
w1+1;
}
现在,我已经定义了一个从int 到wrapper 的转换构造函数和一个从类类型到int 的转换运算符(我还重载了 w1+1 时,它似乎没问题。怎么可能?
【问题讨论】:
-
也许阅读this implicit conversions reference 会有所帮助?
-
另外,对于
a+=5示例,我假设您的意思是您以class_type为参数重载了operator+=?因为它很容易成为一个过载int。 -
根据经验,同时使用隐式构造函数和隐式转换运算符不仅会混淆编译器,还会混淆人类读者。
标签: c++ c++11 type-conversion