“charfun[](intx)const”有什么作用?:C++语法错误
我正在关注在 C++ 中模拟 cpu 的视频。程序员用的如下,也是第一次遇到:
这是视频中的代码:
struct Mem
{
Byte Data[MAX_MEM];
Byte operator[]( u32 Offset ) // <-- I don't understand this syntax
{
}
}
我在自己的项目中是这样写的:
char data[1024*64];
char fun[] ( int x ) const // <-- Is this right?
{
return data[x];
}
我的问题是1#示例中的一行。他们能够编译,但我遇到了错误:
不允许不完整的类型;
不允许使用函数数组;
非成员函数上不允许使用类型限定符。
这种语法实际上有什么作用?有没有另一种写法?
回答
您的最小示例不太正确;他们在视频中使用的语法非常特殊,您已经更改了一些关键部分 - 他们将索引运算符重载为类的成员。正在发生的事情的一个愚蠢的最小示例如下:
struct X {
char data[1024];
char& operator[](int index) {
return data[index];
}
};
您以后可以在其中编写代码,例如
X x;
x[5] = 'a';
该代码段x[5]将调用您的用户定义作为参数operator[]传递5的位置。这里的重点是,本质上,类中函数的名称是operator[]- 这只是与 C++ 的运算符重载特性相关的一些特殊名称。有一些固定的其他运算符集可以通过这种方式定义 - 您还将看到operator()是要x(a,b,c,...)为用户定义类型的对象定义X还是operator+要x+y定义。请注意,这operator是一个关键字 - 它的名称不能与其他名称互换。此外,对于索引运算符(和其他一些),此类函数可能仅在类内定义(尽管有些函数,例如可以在类operator+外定义)。
在这个问题上有一个关于重载的很好的一般参考。