使用C++时应注意的几个小问题
关键字class与struct差别:
我们知道在C++中定义类,关键字class和struct是等效的,但是在类定义中采用默认访问权限的方式声明成员函数/变量时,你会发现两者还是有所差别的,如下表:
默认访问权限 | |
使用class定义类 | private |
使用struct定义类 | public |
关键字mutable的用法:
mutable关键字似乎并不被经常使用,笔者也是在无意间才知道的,下面说一下它的用法。
mutable的作用是用来修饰类的成员变量,使这个成员变量的值在任何情况下都可以被修改,例如:
为叙述方便,预定义一个类TObject,如下:
class TObject
{
int iValue;
};
情况1:
我们知道,若TObject中存在一个成员函数,并且次函数的声明末尾加上了const关键字,形式如下:
void setValue(int) const; // 注:有些地方把这种函数称为常函数。
那么这就意味着,这个函数的实现中不能修改该类的成员变量的值,但是,倘若我们要记录这个函数调用的次数,我们会有很多方法,如间接调用该函数,但是这显然不是一个好方法,这会增加类的复杂度。这个时候mutable就派上用场了,它可以使被修饰的成员变量在该种情况下被改变,你可以这样书写代码:
class TObject
{
mutable int iValue;
public:
void setValue(int pValue) const
{
iValue++;
}
};
当然,这并不是一个好例子,因为它没有多少实用价值,我的目的在于说明问题。
情况2:
若有一个TObject的实例被定义为常量,如:
const TObject tObject; // 注:有些地方将之称为常对象。
如果没有mutable的话,这显然意味着你将无法修改该对象,那么,如果你只希望关闭掉部分成员变量的修改权,那么你就应该像情况1那么书写代码,让你调用setValue成员函数时仍能修改iValue的值。
关键字static在类成员函数/变量中的使用方法:
修饰成员变量,示例代码如下:
class TObject
{
public:
static int iValue;
void setValue(int);
};
其中iValue被声明为静态成员变量,这就意味着这个变量被所有这个类的实例所共享,并且不能被非static修饰的成员函数修改,对此例来讲,setValue(int)是不能修改iValue的值的,对静态变量初始化也需要特殊的语法,对此例要在源文件(*.cpp)中这么写:
int TObject::iValue = 0;
调用方法有两种:
int iValue = TObject::iValue;
或
TObject tObj;
int iValue = tObj.iValue;
修饰成员函数,示例代码如下:
class TObject
{
public:
static void SetValue(TObject&);
};
这个函数既可以修改该类的静态变量,也可以修改普通变量,但是需要格外注意的是,在这个函数的实现中不能出现this关键字,因为它不对类的实例作用。
调用方法有两种:
TObject::SetValue(*new TObject);
或
TObject tObj;
tObj.SetValue(*new TObject);