2010-04-30 65 views
2

如果我有一个函数api,期望一个14位数字输入并返回一个6位输出。我基本上将输入定义为一个const char *。那会是正确和安全的事情吗? 也为什么我不想只做char *我可以,但在这种情况下使用const char *似乎更加谨慎,尤其是因为它提供了一个API。所以对于不同的输入值,我生成6位数字代码。何时使用const char *

回答

4

当您说const char *c时,您告诉编译器您将不会对c指向的数据进行任何更改。所以如果不直接修改输入数据,这是一个很好的做法。

+0

除了告诉编译器,这对API的用户也是一个有用的提示。 – Vicky 2010-04-30 14:25:13

4

通过使用const,你可以保证你的用户不会改变被传入的字符串。它成为API的一部分,帮助定义函数的行为。它还允许用户传递常量字符串,包括像“mystring”这样的字符串。

+0

+1在使用'const char *'表示字符串文字可以传递给一个函数 - 在我开始在我的C代码中使用const之前,如果我可以或不可以,这永远是一个噩梦。 – 2010-04-30 14:29:43

10

我不知道你为什么要使用字符指针,在那里你可以使用std::string

std::string code(const std::string& input) 
{ ... } 

如果你没有选择,使用const char*给出了一个向用户保证,你不会改变他的数据,特别是如果它是一个字符串文字,修改一个是未定义的行为。

+0

+1我只是自己写这个。 – 2010-04-30 14:29:45

1

你得到几个好处使用const

  1. 它记录了你的代码,用户是没有害处将做此字符串。
  2. 您允许用户发送他可能拥有的const char*。自动从非const转换为const。另一种方法是应该避免的(并且明确地完成,并且有时可能导致未定义的行为)
  3. 您让编译器检查您。编译器现在可以验证您是否意外更改了用户的字符串。
0

您需要使用const char *任何地方,你传递一个字符串,或编译器会放水(假设你不希望将其转换为一个std::string)。

+1

“或者编译器会拒绝” - 取决于警告选项。在C++中,可以将字符串字面值隐式转换为非const char *类型,但这样做不是一个好主意。 – 2010-04-30 15:01:51

0

const char*通常用于参数,说明你的函数不会修改该字符串。

void function(char* modified_str, const char* not_modified_str) { ... } 

如果你要返回const char*你想说的并不明显。你试图告诉没有人应该修改返回的字符串,但是你仍然(我认为它会这样)将所有权转移到调用例程,因此它必须在函数返回的char上调用delete[]

一般来说,使用std::string,那么你的函数将通过以下方式:

std::string function(std::string& modified_str, const std::string& not_modified_str) { ... } 
1

字符串常量有静态存储类(它们的存在对节目的持续时间),可能是也可能不是如果相同的字符串文字是从程序中的多个位置引用的,则共享。修改字符串文字的效果是未定义的;因此,你应该总是将一个指向字符串的指针声明为const char *。