从字符串const转换为不推荐的转换。到wchar_t *

时间:2010-09-23 14:20:25

标签: c++ deprecated wchar-t

你好我有一个泵类需要使用一个成员变量,该变量是一个指向包含端口地址的wchar_t数组的指针,即:“com9”。

问题在于,当我在构造函数中初始化此变量时,我的编译器会标记折旧的转换警告。

pump::pump(){
   this->portNumber = L"com9";}

这很好用,但每次编译时都会发出警告,这让我觉得我做错了。

我尝试创建一个数组,然后像这样设置成员变量:

pump::pump(){
   wchar_t port[] = L"com9";
   this->portNumber = port;}

但由于某种原因,这使我的portNumber指向'F'。

显然,我的另一个概念问题。

感谢您帮助解决我的无聊问题。

编辑:

作为请求,portNumber的定义是:

    class pump
{
private:
   wchar_t* portNumber;
}

感谢答案,现在已改为:

    class pump
{
private:
   const wchar_t* portNumber;
}

3 个答案:

答案 0 :(得分:12)

如果portNumberwchar_t*,则应为const wchar_t*

字符串文字是不可变的,因此元素是const。存在从字符串文字到非常量指针的不推荐的转换,但这是危险的。进行更改,以确保类型安全,不使用不安全的转换。

第二个失败是因为您指向局部变量的内容。当构造函数完成时,变量消失,你指向一个无效的位置。使用它会导致未定义的行为。

最后,使用初始化列表:

pump::pump() :
portNumber(L"com9")
{}

初始化列表是初始化,构造函数是完成构造。 (另外,对于几乎所有C ++人来说,this->都是丑陋的;它并不好看和多余。)

答案 1 :(得分:2)

使用const wchar_t*指向文字。

转换存在的原因是因为它从C的早期版本开始有效,将字符串文字分配给非常量指针[*]。它被弃用的原因是修改文字是无效的,使用非常量指针来引用一些不能修改的东西是有风险的。

[*] C最初没有const。添加const后,显然它应该适用于字符串文字,但是已经存在代码,在const存在之前写入,如果突然你不得不在任何地方撒上const那么会破坏。我们今天仍在为这种语言的突破性变化付出代价。因为它是你正在使用的C ++,所以它甚至不是对这种语言的重大改变。

答案 2 :(得分:1)

显然,portNumberwchar_t *(非常),对吗?如果是这样的话:

  • 第一个是错误的,因为字符串文字是只读的(它们是指向存储在可执行文件的字符串表中的char 通常数组的常量指针,它映射到记忆在某个地方,通常是在一个只读页面。) 对于非const char s / wchar_t的丑陋,隐式转换已获得批准,IIRC,以实现与const甚至不存在时编写的旧代码的兼容性;遗憾的是,它让许多不知道 const正确性的蠢货意味着要编写代码,即使const指针是正确的选择,也要求非常量指针。

  • 第二个是错误的,因为你使portNumber指向堆栈上分配的变量,当构造函数返回时,该变量将被删除。构造函数返回后,存储在portNumber中的指针指向随机垃圾。

正确的方法是将portNumber声明为const wchar_t *,如果不需要修改的话。相反,如果 需要在类的生命周期内进行修改,通常最好的方法是避免使用C风格的字符串,只需要输入std::wstring,处理与字符串相关的所有簿记。