订阅对const的引用

时间:2013-05-14 14:20:51

标签: c++ reference const

我在这里看一些C ++代码并且我不理解某些东西。这是无关紧要的,但它来自YARP(机器人中间件)教程,附带文档。

virtual void getHeader(const Bytes& header) 
{
  const char *target = "HUMANITY";
  for (int i=0; i<8 && i<header.length(); i++) 
  {
    header.get()[i] = target[i]; 
  }
}

现在,header是对const的引用,因此无法在此函数中进行修改。调用get,其原型为char *get() const;。如何header.get()下标和修改?该程序编译良好。我可能还没有理解这里发生了什么,但我基于我在C ++ Primer中读到的内容......

我非常感谢您的澄清!

度过愉快的一天,

4 个答案:

答案 0 :(得分:1)

char *get() const;

右手const意味着“这个成员不会改变那个不可变的类中的任何东西”,并且它尊重它 - 它没有改变任何东西。实现可能是这样的:

char *Bytes::get() const
{
    return const_cast<char *>(m_bytes);
}

然而,返回的指针是一个简单的“char *”。想一想:

(header.get())[i] = target[i];
// or
char* p = header.get();
p[i] = target[i];

答案 1 :(得分:0)

设计界面的人决定通过将值填入其中来修改const Byte对象的内容。据推测,他们已经完成了header.get()[i]可修改所需的任何黑客攻击。我不会将此代码用作良好界面设计的示例。

答案 2 :(得分:0)

header.get()应该返回char*,假设它是基地址并且使用[i]编入索引并且target中的字符串应对该位置。

@antitrust给出了好点,返回地址不能被地址内容修改,例如。

char x[100];
char* get() const
{
   return x;
}

int调用函数你可以这样做:

get()[i] = target[i]; 

它会将target字符串复制到x,当x私有成员到类时,此方法非常有用,并且您要复制{ {1}}。

编辑如果get()是a inline function ,那么在循环中调用get()函数不会影响性能。我的意思是这样的函数应该内联定义。

答案 3 :(得分:0)

查看doc

struct Bytes {
  char* get() const; // works
  char*& get() const; // would not work
  char* mem_;
};

这段代码完全有效,即使这是不好的做法。该 问题是指针的副本和常量 class是lost。 C ++中的constness在很大程度上是概念性的而且很容易 休息(通常甚至没有后果)。我抱怨了 实施者。它应该是这样的:

struct Bytes {
  char* get(); // works
  const char* get() const; // would not work
  char* mem_;
};