5

在 C# 中,这当然是可能的,因为这个可编译的示例可以显示:

static void Teste(int x) { }
static void Teste(ref int x) { }
static void Teste()
{
    int i = 0;
    Teste(i);
    Teste(ref i);
}


但它可以在 C++(/CLI) 中使用构造函数完成吗?请参见下面的示例:

class Foo
{
    Foo(int bar)
    {
        // initializing "Foo" instance...
    }
    Foo(int &bar)
    {
        // initializing "Foo" instance...
    }

    //...
}

尽管此类确实使用这些构造函数进行编译,但当我应用一个是另一个时,我看不到如何选择,也就是说,调用是模棱两可的,因为在 C# 中没有为此目的而知道的关键字“ref”。我在构造函数里试了一下,名字必须和类一样(当然可以加个无用的参数,但我想知道能不能做)。

顺便说一句,我用谷歌搜索,只得到“通过 ref 传递和按值传递有什么区别?”之类的东西。但没有像这样覆盖过载。而且我想作为解决方法,我可以使用指针,这要归功于“获取地址”(&);或者如上所述,有一个额外的无用参数。但我想知道的是:我可以有这样的重载(按引用/按值)吗?

提前致谢,

4

1 回答 1

1

您可以通过提供对所需类型的显式强制转换来在 C++ 中完成类似的操作。

struct Foo
{
    Foo(int /*bar*/) {}
    Foo(int &/*bar*/) {}
};


int main()
{
    int value = 5;
    Foo foo(static_cast<const int&>(value));

    return 0;
}

强制转换const将导致重载决议忽略采用非常量引用的构造函数,并将确定按值传递。

于 2013-04-21T21:20:59.230 回答