首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不推荐使用字符串const进行转换。转到wchar_t*

不推荐使用字符串const进行转换。转到wchar_t*
EN

Stack Overflow用户
提问于 2010-09-23 22:20:25
回答 3查看 9.4K关注 0票数 7

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

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

代码语言:javascript
运行
复制
pump::pump(){
   this->portNumber = L"com9";}

这工作得很好,但每次我编译的时候都会出现警告,这让我觉得自己做错了什么。

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

代码语言:javascript
运行
复制
pump::pump(){
   wchar_t port[] = L"com9";
   this->portNumber = port;}

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

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

谢谢你帮我解答我的那些下流的问题。

编辑:

根据要求,portNumber的定义为:

代码语言:javascript
运行
复制
    class pump
{
private:
   wchar_t* portNumber;
}

由于答案,它现在已更改为:

代码语言:javascript
运行
复制
    class pump
{
private:
   const wchar_t* portNumber;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-23 22:27:47

如果portNumber是一个wchar_t*,那么它应该是一个const wchar_t*

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

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

最后,使用初始化列表:

代码语言:javascript
运行
复制
pump::pump() :
portNumber(L"com9")
{}

初始化列表是初始化,构造函数是完成构造。(而且,对于几乎所有的C++用户来说,this->都很难看;它既不友好也不多余。)

票数 13
EN

Stack Overflow用户

发布于 2010-09-23 22:28:21

使用const wchar_t*指向文字。

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

*C最初没有const。当添加const时,显然它应该应用于字符串文字,但是在const出现之前就已经有了编写的代码,如果你突然不得不到处散布const,这些代码就会崩溃。今天,我们仍在为语言的突破性变化付出代价。因为您使用的是C++,所以它甚至不是这种语言的突破性变化。

票数 2
EN

Stack Overflow用户

发布于 2010-09-23 22:29:14

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

  • 第一个是错误的,因为字符串是只读的(它们是指向字符数组的常量指针,通常存储在可执行文件的字符串表中,该字符映射到内存中的某个地方,通常在只读页中)。

到非常数chars/wchar_ts的丑陋的隐式转换被批准,IIRC,以实现与const还不存在时编写的旧代码的兼容性;可悲的是,它让许多不知道常量正确性是什么意思的笨蛋编写了要求非常数指针的代码,即使常量指针是正确的选择。

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

正确的方法是在不需要修改的情况下将portNumber声明为const wchar_t *。相反,如果在类的生命周期中确实需要修改它,通常最好的方法是完全避免C样式的字符串,只抛出一个std::wstring,它将负责与字符串相关的所有记账工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3779350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档