修改对作为参数传递给方法的const char *的引用是否有意义?

时间:2012-03-26 23:38:53

标签: c++

说我有以下几点:

int main()
{
    const char* someString = "Hello";

    MyClass myClass;
    myClass.modifySomeString(someString);

    return 0;
}

modifySomeString的两种可能的方法签名:

案例A void MyClass::modifySomeString(const char* inBuffer)

这似乎是毫无意义的,因为我得到一个值,所以无论我对inBuffer做什么都不影响main()中的原始someString,对吗?

案例B void MyClass::modifySomeString(const char*& inBuffer)

在这里,我有一个对指针的引用,所以我可能实际上修改了main()中的原始“字符串”(为了清楚起见,可能应该调用参数inOutBuffer ...)。但除了我可以强制删除const并修改我的方法中的实际参数之外......这不是一件坏事吗?

我的意思是:

  1. someString在main中被声明为const,因此尝试将其传递给方法以便对其进行修改是荒谬的
  2. 在方法内部,如果我说这个参数也是const,那么再次尝试绕过它的const修改它会影响main中的someString似乎是错误的。
  3. 我对A和B案件的观察是否正确?或者是否有理由将const字符串传递给方法并期望该方法仍然可以修改原始字符?

    就我个人而言,我认为如果我将const传递给方法,那么该方法应该有一个out参数,我得到一个新的字符串,而不更改原始字符串。类似的东西:

    void MyClass::modifySomeString(const char* inBuffer, char*& outBuffer)
    

    但我对建议或某人解释为什么修改const参数完全没问题感兴趣。

4 个答案:

答案 0 :(得分:2)

如果是A,你获取字符串的副本,你只需获得指针的副本。你是对的,这是没有意义的,因为你不能改变字符(除了const_cast,你不应该使用它),并且调用者不会看到对指针本身的更改。 / p>

但是,在B的情况下,您可以引用调用者的指针变量。您无法修改它当前指向的字符串,但您可以重新指定它以指向完全不同的字符串,并且当您的函数返回时,调用者将通过该变量看到不同的字符串。也就是说,从某种意义上说,从调用者的角度“修改”字符串。

这可能是合法的事情,但它也有点奇怪,你需要非常小心内存泄漏。当您为该指针指定不同的地址时,请确保不会导致调用者丢失其指向旧字符串的唯一指针。

答案 1 :(得分:0)

您不应该创建一个编辑变量的函数,特别是如果它是常量的。你应该创建一个新字符串是正确的。

答案 2 :(得分:0)

没有。制作参数const的关键是你承诺不修改它。根据您的编译器,您可能会被禁止这样做 - 不仅仅是警告。

答案 3 :(得分:0)

修改任何声明为const的变量是未定义的行为。这意味着如果您使用char * mutable_ptr = const_cast<char *> (someString);然后通过someString修改mutable_ptr,则结果是未定义的。它可以改变值,它什么都不做,你的程序可能崩溃,或者编译器可以通过调用format_hard_drive();替换整个事件。

使用const_cast来修改您传递给const的内容的唯一时间是,如果您知道该值实际上未声明为const。例如:

void foo (char const * ptr) {
    // do something with a const_cast on ptr
}
int main () {
    char bar [] = "Cool!";
    foo (bar);
    return 0;
}

bar未声明为const,因此在const_castfoo远离const限定符是安全的。但是,这样做几乎总是表明设计不佳。如果您需要能够修改传递给函数的变量,则在没有const限定符的情况下声明引用。

这是C ++,关于使用std::string而不是char const *的所有常规陈述都适用。