完全披露 - 这是一项家庭作业。我通常不会要求提供家庭作业帮助,但现在就是。
我被要求提供5个“在c ++中隐式重载”的例子。我确定他在iostream中引用了char,int,float等类型的运算符重载以及类型本身。
我理解显式重载了一些操作符,例如(我的愚蠢的例子)
class Vegetables {
public:
Vegetables();
~Vegetables();
Vegetables& operator+ (Vegetables&);
Vegetables& operator- (Vegetables&);
private:
int beans;
... // more veggies here
};
Vegetables& Vegetables::operator+ (Veggies&) {
beans += Veggies.beans;
...
return *this;
}
所以我只是想确定他是否在引用添加类型时“隐式”的重载。例如,int + double。我认为实际发生的是int被转换为double,然后使用double +运算符并返回double?当然,这种情况发生的方式取决于它是值赋值还是iostream或其他I / O方法等。但我的观点仍然是......
答案 0 :(得分:4)
已经很晚了。我累了。但这很有趣......
“在c ++中隐式重载” 远非明确。
这让某些人创造了自己的术语。也许他们只是无法从第三方的角度来看自己的着作,因此是愚蠢的。很可能,您的老师正在忙于自己的研究项目(或其他工作),并且正在尽最大努力教您。太糟糕了。你付了很多钱而且受到了可怕的待遇。我自己去过那儿。我只能说,习惯它。或者找一所更好的学校。下次,尽快阅读作业,并问你的老师!如果有足够的人打扰他,浪费他的时间,他会一起行动。
下一步想法:试试google。永远是你的朋友。
我的想法:他可能正在讨论自动(隐式)创建的重载函数,例如复制构造函数。考虑:
class Foo
{
public:
int i;
Foo(int argI) : i(argI) { }
//Foo( const Foo & argFoo ) : i(argFoo.i) { }
};
int
main()
{
Foo f(2),g(3);
Foo h = f;
}
复制构造函数注释掉后,您将只找到 f(2)和 g(3)调用 Foo(int)。 Foo h = f 行正在通过重载 Foo的 隐式复制构造函数 正确初始化 h ( INT)。 (Caveat Emptor:我仍然坚持使用过时的gcc / g ++ 3.4.4& 4.0.1。你的编译器的里程可能会有所不同......)
由于复制构造函数和 operator =()未被继承,因此您可能也会从子类化中获得一些好处,并且会创建新的隐式版本。
另一个想法:正如(大家)已经提到过的,你的导师可能会想到如何转换类型。例如,我们可以使用浮点值初始化 g(3.2)。它将转换为int,并使用 Foo(int)。 (根据您的编译器设置,您可能[应该!]收到关于精度损失的警告。)
我们也可以走另一条路。在类Foo 中添加一行,如:
operator int() { return i; }
意味着我们现在可以写:
cout << "Foo h = " << h << endl;
其中 h 会自动转换为int。
自动转换可以在很多内置类型之间发生。在double / long-double / float和int / short / long / etc之间以及signed / unsigned等等(顺便说一下,这是一个非常好的方法,通过错误地调用错误的重载函数来搞砸自己。将-1转换为unsigned为大数字做了...无意中做无符号数学,你的意思是签名数学是另一个容易的问题!)
指针可以安静地转换为(void *)。考虑:
void voidFunction (void * v) { cout << "v= " << v << endl; }
int main() { Foo z(2); voidFunction(&z); }
当然,每个人都很明显的情况是多态,其中我们传递一个派生类,并将其作为基类接收。
还有另一种情况,我们传递数据,并根据调用的函数/方法的数据创建一个新的临时对象。
有变量参数列表,即整个省略号( printf(format,...))。 (例如, #include&lt; stdarg.h&gt;。va_start(),va_arg(),va_end()。)隐式超载,但可能不是他在想的......
有一些宏,包括常规的 #define FOO(X)和变量参数列表宏......再次,明显超载。再一次,可能不是他想到的......
有模板,虽然这似乎属于显式超载的范围......
底线:只有你的老师知道他到底想要什么......祝你好运!