我有这种方法:
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;
}
它被多次调用。 没有向类中添加“成员变量”以缓存值,是否有其他方法可以一次为两个CString
和int
值创建值?因为它们在程序执行期间不会更改。
上面的方法是static
。我知道为静态变量分配值,但我知道只能在声明时一次进行操作。我错过了吗?
答案 0 :(得分:1)
您可以在函数范围内使用static
常量(或变量,但是如果不希望将其更改为变量,为什么要使其可变呢?)
static CString const someImmutableText = <some initializer>;
上面的占位符<some initializer>
可以是文字,函数调用或任何其他可用来初始化CString的表达式。 static
确保对象仅创建一次,随后也仅初始化一次。
答案 1 :(得分:1)
@Ulrich的答案当然可以很好地工作,但是如果<some initializer>
不平凡,则存在隐藏的缺点-从C ++ 11开始,编译器需要生成threadsafe initialiser。 / p>
这具有最小的运行时开销,但是它确实生成了很多代码see at 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_me
与nullptr
进行比较即可。