只设置一次方法中变量的值

Setting the value for variables in a method just once

本文关键字:方法 变量 一次 设置      更新时间:2023-10-16

我有这个方法:

bool CDemoPickerDlg::IsStudentTalk(CString strAssignment)
{
bool bStudentTalk = false;
CString strTalkMain, strTalkClass;
if (theApp.UseTranslationINI())
{
strTalkMain = theApp.GetSMMethod(_T("IDS_STR_HISTORY_TALK_MAIN"));
strTalkClass = theApp.GetSMMethod(_T("IDS_STR_HISTORY_TALK_AUX"));
}
else
{
strTalkMain.LoadString(IDS_STR_HISTORY_TALK_MAIN);
strTalkClass.LoadString(IDS_STR_HISTORY_TALK_AUX);
}
int iTalkMainLen = strTalkMain.GetLength();
int iTalkClassLen = strTalkClass.GetLength();
if (strAssignment.Left(iTalkMainLen) == strTalkMain ||
strAssignment.Left(iTalkClassLen) == strTalkClass)
{
bStudentTalk = true;
}
return bStudentTalk;
}

它被调用多次如果不将"成员变量"添加到类中以缓存值,是否有其他方法可以一次性为两个CStringint值创建值?因为它们在节目期间不会改变。

上述方法为static。我知道如何为静态变量赋值,但我知道在声明时只能执行一次。我错过了明白吗?

您可以在函数范围中使用static常量(或变量,但如果不应该更改,为什么要将其设为变量?(

static CString const someImmutableText = <some initializer>;

上面的占位符<some initializer>可以是文字、函数调用或任何其他可以初始化CString的表达式。static确保对象只创建一次,随后也只初始化一次。

@Ulrich的答案当然会很好,但如果<some initializer>不是微不足道的,那么就有一个隐藏的缺点——从C++11开始,编译器需要生成线程安全初始化程序。

这具有最小的运行时开销,但它确实生成了相当多的代码,请参阅Godbolt,如果您有很多这样的代码,那么这些代码加起来就可以了。

如果没有多线程问题(通常没有,尤其是在初始化代码中(,那么有一个简单的替代方案可以消除此代码。事实上,它非常简单,几乎不值得发布,但为了完整性,我还是会在这里发布。就是这样;请原谅英国人:

static bool initialised;
static Foo *initialise_me;
static Bar *initialise_me_too;
...
if (!initialised)
{
initialise_me = new Foo (...);
initialise_me_too = new Bar (...);
...
initialised = true;
}
...

注意,要初始化的变量在这里被声明为原始指针,并使用new进行分配。这样做是有原因的——你绝对不希望在声明这些变量的时候调用构造函数,否则你就会回到起点。没有对象生存期问题,因为变量在整个程序期间都存在,所以一切都很好。

事实上,实际上根本不需要bool——只需测试(比如(initialise_menullptr