WEB开发网
开发学院软件开发C++ 关于C++里const的pitfall 阅读

关于C++里const的pitfall

 2010-12-03 07:21:59 来源:WEB开发网   
核心提示:文章主要对MICHAEL PENG(以下称MP)对某开源代码的评价而写, 作者希望给技术讨论增加一点深度,关于C++里const的pitfall,MP认为只要“语义const“就必须加上, 比如他的评论class IRule { public: // MichaelPeng: Name函数

文章主要对MICHAEL PENG(以下称MP)对某开源代码的评价而写。 作者希望给技术讨论增加一点深度。

MP认为只要“语义const“就必须加上, 比如他的评论

class IRule {

  public:

  // MichaelPeng: Name函数可以设置为const

  virtual const char* Name(void) = 0;

  ...

};

上面是个抽象类(abstract class), 定义了继承类必须实现的方法。我把微软专用的LPCSTR 改成了对应的const char*, 相信大家都看得懂。

这个函数返回一个“内容不可修改“的指针, 我这里打上了引号, 根据下面会讲到。

MP认为, 这个函数应该定义为

virtual const char* Name(void) const = 0;

这个我是很同意的。 但是MP在理论时是不是没有看到潜在的问题呢? 假如我已经写了上百个继承类了, 然后我需要要写一个复杂的。我需要去到另一服务器去拿这个NAME。 为了程序的性能, 我只能在第一次调用的时候去拿

class myRemoteRule : public IRule

{

public:

   myRemoteRule(const char* serverA);

   virtual const char* Name(void) const;

private:

   std::string strName;

   std::string serverAddr;

};

const char* myRemoteRule::Name(void) const

{

  if (strName.empty()) {

      strName = getNameFromRemote(serverAddr);

  }

  return strName.c_str();

}

然后编译, 结果编译器给了错误。 因为上面的语句里成员strName 被修改了, 函数不能为CONST。

我已经写了几百个类了, 我得一个一个改回去。 我去翻翻C++的书, 果然有如何翻墙的技术:

const char* myRemoteRule::Name(void) const

{

  if (strName.empty()) {

1 2  下一页

Tags:关于 const pitfall

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接