如果我有一个函数api,期望一个14位数字输入并返回一个6位输出。我基本上将输入定义为一个const char *。那会是正确和安全的事情吗? 也为什么我不想只做char *我可以,但在这种情况下使用const char *似乎更加谨慎,尤其是因为它提供了一个API。所以对于不同的输入值,我生成6位数字代码。何时使用const char *
回答
当您说const char *c
时,您告诉编译器您将不会对c
指向的数据进行任何更改。所以如果不直接修改输入数据,这是一个很好的做法。
通过使用const,你可以保证你的用户不会改变被传入的字符串。它成为API的一部分,帮助定义函数的行为。它还允许用户传递常量字符串,包括像“mystring”这样的字符串。
+1在使用'const char *'表示字符串文字可以传递给一个函数 - 在我开始在我的C代码中使用const之前,如果我可以或不可以,这永远是一个噩梦。 – 2010-04-30 14:29:43
我不知道你为什么要使用字符指针,在那里你可以使用std::string
:
std::string code(const std::string& input)
{ ... }
如果你没有选择,使用const char*
给出了一个向用户保证,你不会改变他的数据,特别是如果它是一个字符串文字,修改一个是未定义的行为。
+1我只是自己写这个。 – 2010-04-30 14:29:45
你得到几个好处使用const
:
- 它记录了你的代码,用户是没有害处将做此字符串。
- 您允许用户发送他可能拥有的
const char*
。自动从非const
转换为const
。另一种方法是应该避免的(并且明确地完成,并且有时可能导致未定义的行为) - 您让编译器检查您。编译器现在可以验证您是否意外更改了用户的字符串。
您需要使用const char *
任何地方,你传递一个字符串,或编译器会放水(假设你不希望将其转换为一个std::string
)。
“或者编译器会拒绝” - 取决于警告选项。在C++中,可以将字符串字面值隐式转换为非const char *类型,但这样做不是一个好主意。 – 2010-04-30 15:01:51
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) { ... }
字符串常量有静态存储类(它们的存在对节目的持续时间),可能是也可能不是如果相同的字符串文字是从程序中的多个位置引用的,则共享。修改字符串文字的效果是未定义的;因此,你应该总是将一个指向字符串的指针声明为const char *。
- 1. 如何将const char连接到const char?
- 2. C++ char const char *
- 3. 是否必须在声明char const * ptr =“some characters”时使用'const'?
- 4. 使用strcpy时从'char'到'const char *'的转换无效
- 5. 如何使用Strtok来标记Const char *?
- 6. 不能将'const char *'转换为'char * const *'
- 7. Const char * vs const wchar_t *(concatenation)
- 8. const char * const和const char []之间有区别吗?
- 9. fstream to const char *
- 10. const char * to LPTSTR
- 11. 与const char *
- 12. Const Char to LPTSTR
- 13. NSString为char(不是const char)
- 14. out_of_range使用std :: map :: at(const char *),编译时使用/ 02
- 15. const char *在C++中的使用
- 16. 在ostream中使用运算符const char *
- 17. iOS - libical/const char * - 内存使用
- 18. 使用const char *的内存故障
- 19. 使用静态为const char * const的,而不是#定义
- 20. 哪一个使用const char []或const std :: string?
- 21. const char *初始化
- 22. 为const char *成员
- 23. const char * to int cast?
- 24. 元帅为const char **
- 25. Const char concatenation和getenv()
- 26. 当使用std :: is_same <T,const char *>时,没有从'T'转换为'const char *'::值
- 27. 段错误时修改char * const pstr =“abcd”;
- 28. 如何将char *从char **传递到const char *
- 29. 为什么MFC C++ CString(const char *)完全改变const char *值?
- 30. 为const char *名称VS为const char *名称
除了告诉编译器,这对API的用户也是一个有用的提示。 – Vicky 2010-04-30 14:25:13