在c ++中隐式重载

时间:2010-10-20 01:47:59

标签: c++ operator-overloading

完全披露 - 这是一项家庭作业。我通常不会要求提供家庭作业帮助,但现在就是。

我被要求提供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方法等。但我的观点仍然是......

1 个答案:

答案 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)和变量参数列表宏......再次,明显超载。再一次,可能不是他想到的......

有模板,虽然这似乎属于显式超载的范围......

底线:只有你的老师知道他到底想要什么......祝你好运!