【问题标题】:What should I choose from the below functions我应该从以下功能中选择什么
【发布时间】:2012-08-25 11:01:47
【问题描述】:

假设我自己设计了一个 String 类,我想重载 operator[] 函数,下面是选择:

String operator[](const size_t index);
String& operator[](const size_t index);
const String& operator[](const size_t index) const;

const、non-const 和引用返回类型的任何其他组合。

【问题讨论】:

  • 为什么字符串的[]操作符会返回一个字符串?
  • @Cubic 一些语言取消了字符串/字符的区别,使用单字符串而不是单独的字符类型。不过,这不是用 C++ 做的好理由。

标签: c++ operator-overloading


【解决方案1】:

string[] 运算符返回一个字符,而不是字符串。根据具体情况,您应该实现其中的一两个:

const char& operator[] ( size_t index ) const;
char& operator[] ( size_t index );

第一个产生一个不能修改的引用。如果你的字符串是不可变的,这就是你所需要的。

第二个生成一个可以修改的引用。您可以使用它来实现一些聪明的东西,例如修改时复制和引用计数。

【讨论】:

  • 你应该两者都有。
  • @user1071136 如果你实现了一个支持所有标准功能的字符串,那么是的,你需要两者。如果你想要一个不可变的字符串,类似于 Java、C# 或 Cocoa 的 NSString 中的字符串,那么第一个运算符本身就足够了。
  • 只是一个附带问题。为了性能,返回 const char 值而不是 const 引用不是更好吗?由于指针是 x4 或 x8,因此 sizeof(char)。
  • @ablm 在现代计算机上,差异可以忽略不计,因为 CPU 寄存器和数据总线足够宽,在传递地址与传递单个字节时不需要额外的周期。取消引用后面的地址将需要一个额外的周期,但用于实现这一点的指令经过高度优化,因此您不会注意到差异。在(很多)较旧的计算机上,例如 8088,会有额外的周期,因此返回 char 确实会更快。
【解决方案2】:

有些人更喜欢operator[] 有一个带符号的参数类型,既更类似于内置的 operator[](它们也支持负索引),也能够检测负值参数(如果你进行越界检查)。

C++ 编译器用来评估调用内置运算符[] 的类型是ptrdiff_t,所以有时你会发现以下内容

char &operator[](ptrdiff_t index);
char operator[](ptrdiff_t index) const;

我通常只使用普通的int 参数类型。

【讨论】:

  • 假设本次返回类型为大数据类型。所以函数应该是这样的:类型 &operator[](int index);和类型 operator[](int index) const;所以我在想的是在第二个函数中返回大数据的引用会更好吗?如果不是,那是什么原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 2021-05-25
相关资源
最近更新 更多