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

时间:2018-07-14 13:44:47

标签: c++

我有这种方法:

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。我知道为静态变量分配值,但我知道只能在声明时一次进行操作。我错过了吗?

2 个答案:

答案 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_menullptr进行比较即可。