使用const std :: string指针作为函数参数

时间:2018-08-03 09:03:33

标签: c++

在编写Java多年之后,我想再次更深入地研究C ++。

尽管我认为我可以处理,但我不知道我是否以“最先进的”方式处理它。

目前,我尝试了解如何处理作为常量指针传递给方法的参数的std :: strings。

根据我的理解,我无法对指针内容(实际的字符串)执行任何字符串操作,因为它是常量。

我有一个方法应该将给定的字符串转换为小写,并且为了使给定的字符串可编辑,我做了大量工作(我相信)。看看:

class Util
{
  public:
  static std::string toLower(const std::string& word)
  {
    // in order to make a modifiable string from the const parameter
    // copy into char array and then instantiate new sdt::string
    int length = word.length();
    char workingBuffer[length];
    word.copy(workingBuffer, length, 0);

    // create modifiable string
    std::string str(workingBuffer, length);

    std::cout << str << std::endl;

    // string to lower case (include <algorithm> for this!!!!)
    std::transform(str.begin(), str.end(), str.begin(), ::tolower);

    std::cout << str << std::endl;

    return str;
  }
};

尤其是第一部分,我使用char缓冲区将给定的字符串复制到可修改的字符串中,这使我很烦。 有更好的方法来实现这一点吗?

关于, 迈克

3 个答案:

答案 0 :(得分:6)

参数为const(它的引用不是指针!),但这并不妨碍您复制它:

 // create modifiable string
std::string str = word;

话虽这么说,为什么首先要将参数设为const引用?使用const引用可以避免参数被复制,但是如果您仍然需要复制,则只需复制一个即可。

std::string toLower(std::string word) { 
    std::transform(word.begin(), word.end(), word.begin(), ::tolower);
    // ....

请记住,C ++不是Java,值是值,不是引用,即副本是真实副本,在函数内部修改word不会对传递给函数的参数产生任何影响。

答案 1 :(得分:2)

您应该替换所有这些内容:

std::string str(word);

简单地说:

{{1}}

它应该可以正常工作=)

答案 2 :(得分:0)

由于必须复制输入字符串,因此最好按值进行输入(与使用col2成员的类相比,最好使用名称空间)

static

namespace util { // modifies the input string (taken by reference), then returns a reference to // the modified string inline std::string&convert_to_lower(std::string&str) { for(auto&c : str) c = std::tolower(static_cast<unsigned char>(c)); return str; } // returns a modified version of the input string, taken by value such that // the passed string at the caller remains unaltered inline std::string to_lower(std::string str) { // str is a (deep) copy of the string provided by caller convert_to_lower(str); // return-value optimisation ensures that no deep copy is made upon return return str; } } std::string str = "Hello"; auto str1 = util::to_lower(str); std::cout << str << ", " << str1 << std::endl; 未经修改地留下:它会打印

str

请参阅here,了解为什么我强制使用Hello, hello