说我有以下几点:
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并修改我的方法中的实际参数之外......这不是一件坏事吗?
我的意思是:
我对A和B案件的观察是否正确?或者是否有理由将const字符串传递给方法并期望该方法仍然可以修改原始字符?
就我个人而言,我认为如果我将const传递给方法,那么该方法应该有一个out参数,我得到一个新的字符串,而不更改原始字符串。类似的东西:
void MyClass::modifySomeString(const char* inBuffer, char*& outBuffer)
但我对建议或某人解释为什么修改const参数完全没问题感兴趣。
答案 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_cast
中foo
远离const限定符是安全的。但是,这样做几乎总是表明设计不佳。如果您需要能够修改传递给函数的变量,则在没有const
限定符的情况下声明引用。
这是C ++,关于使用std::string
而不是char const *
的所有常规陈述都适用。