【问题标题】:Can I have a function/method passing an argument by reference and an overload passing it by value in C++? [duplicate]我可以有一个函数/方法通过引用传递参数,而重载在 C++ 中通过值传递它吗? [复制]
【发布时间】:2013-04-14 17:05:45
【问题描述】:

在 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...
    }

    //...
}

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

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

提前致谢,

【问题讨论】:

  • 尝试通过传递一个指针和一个值来初始化构造函数,看看你得到了什么
  • 这可能是重复的,但在我的辩护中,我搜索的不是很好;此外,另一个问题的名称不是很吸引人(尽管这个问题的名称更少)。另外,作为旁注,另一个人问这是否有意义,我问是否可能。

标签: c# c++ c++-cli pass-by-reference pass-by-value


【解决方案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 的强制转换将导致重载决议忽略采用非常量引用的构造函数,并将确定按值传递。

【讨论】:

  • 为什么是 **const ** int&amp;?为什么int&amp; 不起作用?
  • @JMCF125 因为非常量 ref 仍然可以通过值传递给构造函数。
  • 这很尴尬:它可以工作,但现在我再次测试它并没有!现在似乎将其从const int&amp; 转换为const int...
  • @JMCF125 没关系。发生的情况是复制 'int &var` 中的值并将副本传递给函数。
猜你喜欢
  • 1970-01-01
  • 2015-05-29
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 2014-05-05
相关资源
最近更新 更多