下面的代码不会遇到任何问题,但是将char []
传递给接受std::string&
作为参数的函数是一种好习惯
const char* function(std::string& MyString)
{
MyString = "Hello World";
return MyString.c_str();
}
int main()
{
char MyString[50];
/*
*Is it good practice to cast like this?
*what possible issues i could face because of this casting?
*/
function((std::string)MyString);
std::cin.get();
return 0;
}
答案 0 :(得分:3)
这根本行不通,因为它将需要创建不能绑定到L值引用的临时std::string
。即使函数引用了std::string const
临时文件的创建也会影响性能。因此,根据函数的性质,最好添加一个也接受指向c字符串的指针的重载。或者,如果函数不打算修改字符串,则可以使其接受std::string_view
,以便它可以处理std::string
和c字符串。
答案 1 :(得分:1)
不,这是错误的做法,因为强制转换无效; std::string
可以使用非显式构造函数从char *
进行构造,因此您可以删除强制类型转换,并获得完全相同的代码(只是使用隐式构造而不是显式强制转换)
现在,由于无法将临时对象传递给非常量左值引用,因此您将收到错误(至少对于不中断的编译器而言)。但是,如果您将函数更改为采用const std::string &
,它将可以正常工作。
还有一种不好的做法,就是通过调用std :: string :: c_str()返回您所获得的char *
-仅在未修改或销毁字符串对象的情况下,此指针才有效-因此,返回的指针将在您作为参数传递的临时变量被销毁后立即变为无效(悬空)。如果要将返回的指针保存在main中的局部变量中,然后尝试对其进行处理(如打印),那将是未定义的行为。
答案 2 :(得分:1)
简而言之,通常将a = 1.0 / a
传递给函数接受字符串(来自C)。而且还不错。显式转换在这里不好。该功能也不好,因为它不接受传递char[]
...