如果我有一个函数api,它需要14位输入并返回6位数输出。我基本上将输入定义为const char *。这是正确和安全的事吗? 另外为什么我不想只做char *我可以,但在这种情况下使用const char *似乎更谨慎,特别是因为它是我提供的api。因此,对于不同的输入值,我生成6位数代码。
答案 0 :(得分:10)
我不确定你为什么使用char指针,你可以使用std::string
:
std::string code(const std::string& input)
{ ... }
如果您没有选择,使用const char*
可以保证用户不会更改他的数据,特别是如果它是一个字符串文字,其中修改一个是未定义的行为。
答案 1 :(得分:4)
当您说const char *c
时,您告诉编译器您不会对c
指向的数据进行任何更改。因此,如果您不直接修改输入数据,这是一个很好的做法。
答案 2 :(得分:4)
通过使用const,您承诺您的用户不会更改传入的字符串。它将成为帮助定义函数行为的API的一部分。它还让用户传递常量字符串,包括像“mystring”这样的文字字符串。
答案 3 :(得分:2)
使用const
可获得多项好处:
const char*
。从非const
转换为const
是自动的。反过来是应该避免的事情(明确地做,并且有时可能导致不确定的行为)答案 4 :(得分:2)
字符串文字具有静态存储类(它们在程序的持续时间内存在),如果从程序中的多个位置引用相同的字符串文字,则可以共享也可以不共享。修改字符串文字的效果是不确定的;因此,您应该始终将指向字符串文字的指针声明为const char *。
答案 5 :(得分:0)
您需要在传递字符串文字的任何地方使用const char *
,否则编译器会拒绝(假设您不想将其转换为std::string
)。
答案 6 :(得分: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) { ... }