C++ 使用默认值通过引用传递非常量字符串

C++ pass a non const string by reference with default value

提问人: 提问时间:6/1/2022 更新时间:6/6/2022 访问量:518

问:

所以我正在研究一个代码库,其中在很多地方调用了这个 someFunc,我无法通过在调用此函数的所有地方添加这个新变量来更改它。当根本不需要该变量时,调用 someFunc 的地方也是如此。

所以我有一个要求,我需要有一个函数定义,其中包含一个通过引用传递的字符串,并且我们能够改变相同的值。

  • 按引用传递:因为调用方使用该字符串变量
  • 默认值:因为这个函数是在很多地方调用的,所以不能到处都改变。
  • Non const :因为我想改变它

这是我尝试过的:

ExceptionClass ClassName::someFunc(int a, float b, map<int, string> c, const string &d = "")

这种方法的问题是我无法在我的函数中更改 d 的值。出现以下错误:

enter image description here

如何使用满足我要求的东西?

C++ 字符串 visual-studio 常量 按引用传递

评论

1赞 user17732522 6/1/2022
那么,如果它只是默认的临时修改,那么修改的意义何在呢?(另外,我假设你的意思是不是“我无法在我的函数中更改 c 的值”。ddc
0赞 6/1/2022
好的,所以我正在研究一个代码库,其中在很多地方调用了这个 someFunc,我无法通过在调用此函数的所有地方添加这个新变量来更改它。当根本不需要该变量时,也可以调用该变量someFunc
1赞 fabian 6/1/2022
重载采用 3 个参数而不是 4 个参数怎么样:请注意,有一个可选的 out 参数很奇怪。如果这不是 out 参数,则应按右值引用或值传递参数;两者都允许您指定默认值,此外还不阻止修改作为参数传递的对象。ExceptionClass someFunc(int a, float b, map<int, string> c) { std::string defaultVal = ""; return someFunc(a, b, std::move(c), defaultValue);}
0赞 aschepler 6/1/2022
请编辑问题以解释您希望该函数在使用时如何实际工作。当一个字符串被传入时,传递的字符串对象实际上会被改变,或者函数只会对本地副本进行更改而不改变原来的字符串?当没有传递字符串并使用默认参数时,这意味着函数体所做的更改应该被丢弃?

答:

-1赞 Mohammad Rifat Arefin 6/1/2022 #1

如果要更改字符串,为什么要使用。试试这个版本:const

ExceptionClass ClassName::someFunc(int a, float b, map<int, string> c, string &d)

评论

2赞 6/1/2022
那么默认值呢?给它默认值的主要目的是这个函数在很多地方被调用,我不想在调用它的所有地方添加一个新变量。顺便说一句,我没有投反对票
0赞 Mohammad Rifat Arefin 6/1/2022
你没有提到默认值是你的要求
2赞 fabian 6/1/2022
@MohammadRifatArefin 在标题中“隐藏”此类信息不是一个好习惯,但信息就在那里:“C++使用默认值和非常量通过引用传递字符串”
0赞 Mohammad Rifat Arefin 6/1/2022
对不起,我没有看到标题,完全是我的错!
1赞 user4442671 6/1/2022 #2

您可以使用单独的重载而不是默认值来获取所描述的等效行为:

class ClassName {
public:
  ExceptionClass someFunc(int a, float b, map<int, string> c, string &d);
  ExceptionClass someFunc(int a, float b, map<int, string> c) {
    string d = "";
    return someFunc(a, b, c, d);
  }
};
0赞 Goswin von Brederlow 6/1/2022 #3

将 “” 指定为默认参数是没有意义的。如果您正在修改参数,那么这些更改似乎具有一些值,并且字符串文本会丢失这些值。

我能想到两种有意义的方法:

static string someFuncDefault = "";
ExceptionClass ClassName::someFunc(int a, float b, map<int, string> c, string &d = someFuncDefault);

ExceptionClass ClassName::someFunc(int a, float b, map<int, string> c, optional<reference_wrapper<string>> d_opt = {});

第一种情况将具有一个在函数调用中保留的默认参数。因此,对一个调用的修改将更改下一个调用的默认用途。

第二个使字符串成为可选的,但在某种程度上,代码可以检查它是否被传递并相应地运行。如果字符串没有被传递,则没有必要修改字符串。

但实际上,你为什么没有 2 个功能?一个有 3 个,一个有 4 个参数?

评论

0赞 6/1/2022
One with 3 and one with 4 arguments仅实现了这一点 RN,但您的第一种方法的问题是该变量将永远保留在内存中,直到进程关闭