7

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

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

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

这工作正常,但每次编译时的警告都很烦人,让我觉得我做错了什么。

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

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

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

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

感谢您对我的noobish问题的帮助。

编辑:

根据要求,portNumber 的定义是:

    class pump
{
private:
   wchar_t* portNumber;
}

感谢答案,它现在已更改为:

    class pump
{
private:
   const wchar_t* portNumber;
}
4

3 回答 3

13

如果portNumber是 a wchar_t*,它应该是 a const wchar_t*

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

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

最后,使用初始化列表:

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

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

于 2010-09-23T14:27:47.133 回答
2

用于const wchar_t*指向文字。

存在转换的原因是因为从早期版本的 C 开始,将字符串文字分配给非常量指针 [*] 是有效的。不推荐使用它的原因是修改文字是无效的,并且使用非常量指针来引用不得修改的内容是有风险的。

[*] C 最初没有const. 当const被添加时,显然它应该适用于字符串文字,但已经有代码,在const存在之前编写,如果突然你不得不const到处撒,就会破坏。我们今天仍在为语言的这一重大变化付出代价。由于您使用的是 C++,因此它甚至都不是对这种语言的重大更改。

于 2010-09-23T14:28:21.187 回答
1

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

  • 第一个是错误的,因为字符串文字是只读的(它们是指向通常存储在可执行文件的字符串表中的 char 数组的 const 指针,该数组映射到内存中的某个地方,通常在只读页面中)。
    IIRC 批准了向非 const chars/ s 的丑陋隐式转换,以实现与甚至不存在wchar_t时编写的旧代码的兼容性;const可悲的是,它让许多不知道const 正确性意味着什么的白痴摆脱了编写询问非 const 指针的代码,即使 const 指针是正确的选择。

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

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

于 2010-09-23T14:29:14.457 回答