【问题标题】:Using the value _T("") and CString variables使用值 _T("") 和 CString 变量
【发布时间】:2021-12-15 06:06:35
【问题描述】:

这听起来可能很简单,但我想知道一种方法是否真的更有效。

示例一:

  • CString strName = _T("");
  • CString strName = CString();

示例二:

  • if (strFilterText == _T(""))
  • if (strFilterText.IsEmpty())

这样使用_T("")有什么负面影响吗?如果是这样,为什么?

【问题讨论】:

  • 计划CString strName; 声明一个空字符串。 IsEmpty() 原则上应该是检查空字符串最快的(因为它专用于该任务,它可以使用任何最有效的技术),尽管我怀疑差异非常小。
  • 此时您不应再使用_T("");而是L""

标签: c++ visual-c++ mfc c-strings


【解决方案1】:

CStringoperator overloads有不同的构造函数,是为不同的场景准备的。这是一个复杂的类,但一般来说,这样的类是这样工作的:

使用默认构造函数CString()(初始化为_T("")):

CString s1 = CString();     
CString s2;                 //same as above, shortcut
CString s3{};               //same as above
CString s4 = {};            //same as above

使用复制构造函数CString(const CString& src):

const CString src = _T("");

CString s1 = CString(src);  
CString s2 = src;           //same as above
CString s3 = { src};        //same as above
CString s4(src);            //same as above

使用不同的构造函数CString(const TCHAR* src):

const TCHAR* src = _T("");

CString s1 = CString(src);  
CString s2 = src;           //same as above
CString s3 = { src };       //same as above
CString s4(src);            //same as above

CString 还支持= 赋值运算符:

CString s;
s = _T("");                 //uses `=` assignment operator

s = CString();              //uses default constructor for right side, 
                            //calls `=` assignment operator for left side.

== 运算符重载可以使用CString::Compare 来比较两侧。所以

if (s == _T(""))if (s.Compare(_T("")) == 0)相同,可能比s.IsEmpty()慢1纳秒,否则有效。

【讨论】:

  • 为了补充,我在这里遗漏了 CString s1(src)。我认为它可能比 CString s1 = src 更快。
  • @tom CString s1(src)CString s1 = src完全相同相同。
  • @tom 注意CString s1 = src;中没有调用赋值运算符,编译器使用匹配的构造函数(更新答案)
猜你喜欢
  • 2013-03-08
  • 2011-05-29
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多