使用C++时应注意的小问题

使用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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值