只设置一次方法中变量的值
Setting the value for variables in a method just once
我有这个方法:
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
。我知道如何为静态变量赋值,但我知道在声明时只能执行一次。我错过了明白吗?
您可以在函数范围中使用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_me
与nullptr
。
相关文章:
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 枚举环境变量的惯用C++14/C++17方法
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 从私有成员变量的成员方法返回unique_ptr
- 在派生类中使用基类的私有成员变量的最佳方法
- 打印所有继承的类成员变量和方法
- C++方法中的引用变量
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- 有没有一种通用的方法来实现不变量
- 有没有将变量名称转换为双指针的简短方法?
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++ 互斥锁可以交叉方法/变量吗?如果是这样,为什么在这里不起作用?
- 类方法变量,如果将它们存储在类本身中会更快吗?
- 将局部方法变量分配给类指针
- 列出派生类中的所有方法/变量
- 相互冲突名称的成员变量和方法变量
- C++如果我有一个对象指针,是在堆栈或堆上分配的方法变量
- 如何从另一个类访问一个类的方法/变量,而不在c++中实例化它或子类
- 指定类变量与方法变量C++