如何在 C++ 中重载访问器和增变器 operator[]
how to overload accessor and mutator operator[] in c++
我想写一个Stringclass。并想使用下标访问我的 String 中的元素。所以,我写了两个成员函数,一个是获取String中的元素,另一个是设置String中的元素。请看下面的代码;
#include <iostream>
#include <algorithm>
using namespace std;
class String {
public:
String();
String(const char *s);
char &operator[] (int index);
char operator[] (int index) const;
private:
char *arr;
int len;
};
String::String() {
arr = new char[1];
arr[0] = '[=10=]';
len = 0;
}
String::String(const char *s) {
len = strlen(s);
arr = new char[len + 1];
std::copy(s, s + len + 1, arr);
}
//mutator operator[] ---> used to change data members;
char& String::operator[](int index)
{
cout << "mutator []" << endl;
if (index > len || index < 0)
throw std::out_of_range("Index out of range");
return arr[index];
}
//Accessor operator[]---> used to read data members
char String::operator[](int index) const
{
cout << "accessor []" << endl;
if (index > len || index < 0)
throw std::out_of_range("Index out of range");
return arr[index];
}
int main()
{
String s1 = "abc";
s1[1] = 'b'; //---> should use mutator operator
String s2 = "efg";
s2[1] = s1[2]; //---> should use both accessor and mutator operator
char a = s1[2]; //---> should use accessor operator
cout << s2[1] << endl; //---> should use accessor operator
}
当我运行这段代码。它的输出都是mutator
;这让我很困惑;
char operator[] (int index) const;
只会在你有 const String
时调用。如果我们将您的 main()
更改为:
int main()
{
const String s1 = "abc";
char a = s1[2]; //---> should use accessor operator
}
它将输出:
accessor []
让我们从编译器的角度来看这个案例。我给你这个代码:
String s2;
/* things */ s1[2] /* things */
你选择什么功能?访问器还是修改器?由于 s2
不是 const 对象,让我们采用非 const 版本!
这就是为什么您的代码总是打印 mutator
,编译器不会根据您对结果的处理来选择调用哪个函数。是否调用 char
的赋值运算符。
并且你的 const 版本不应该 return 一个副本,而是一个 const 引用:
char& operator[](size_t index);
const char& operator[](size_t index) const;
如果您尝试写入 const 字符串,您将收到编译错误而不是未分配的值。
我想写一个Stringclass。并想使用下标访问我的 String 中的元素。所以,我写了两个成员函数,一个是获取String中的元素,另一个是设置String中的元素。请看下面的代码;
#include <iostream>
#include <algorithm>
using namespace std;
class String {
public:
String();
String(const char *s);
char &operator[] (int index);
char operator[] (int index) const;
private:
char *arr;
int len;
};
String::String() {
arr = new char[1];
arr[0] = '[=10=]';
len = 0;
}
String::String(const char *s) {
len = strlen(s);
arr = new char[len + 1];
std::copy(s, s + len + 1, arr);
}
//mutator operator[] ---> used to change data members;
char& String::operator[](int index)
{
cout << "mutator []" << endl;
if (index > len || index < 0)
throw std::out_of_range("Index out of range");
return arr[index];
}
//Accessor operator[]---> used to read data members
char String::operator[](int index) const
{
cout << "accessor []" << endl;
if (index > len || index < 0)
throw std::out_of_range("Index out of range");
return arr[index];
}
int main()
{
String s1 = "abc";
s1[1] = 'b'; //---> should use mutator operator
String s2 = "efg";
s2[1] = s1[2]; //---> should use both accessor and mutator operator
char a = s1[2]; //---> should use accessor operator
cout << s2[1] << endl; //---> should use accessor operator
}
当我运行这段代码。它的输出都是mutator
;这让我很困惑;
char operator[] (int index) const;
只会在你有 const String
时调用。如果我们将您的 main()
更改为:
int main()
{
const String s1 = "abc";
char a = s1[2]; //---> should use accessor operator
}
它将输出:
accessor []
让我们从编译器的角度来看这个案例。我给你这个代码:
String s2;
/* things */ s1[2] /* things */
你选择什么功能?访问器还是修改器?由于 s2
不是 const 对象,让我们采用非 const 版本!
这就是为什么您的代码总是打印 mutator
,编译器不会根据您对结果的处理来选择调用哪个函数。是否调用 char
的赋值运算符。
并且你的 const 版本不应该 return 一个副本,而是一个 const 引用:
char& operator[](size_t index);
const char& operator[](size_t index) const;
如果您尝试写入 const 字符串,您将收到编译错误而不是未分配的值。