我该如何重载''运算符?

Posted

技术标签:

【中文标题】我该如何重载\'\'运算符?【英文标题】:How exactly can I overload the '' operator?我该如何重载''运算符? 【发布时间】:2020-03-31 11:49:56 【问题描述】:

要初始化一个std::vector,我可以直接使用initializer_list,像这样:

std::vector<int> myVec = 1, 2, 3, 4;

如果我创建一个自定义列表类(它将包含许多项目),例如class customVector(为了简单起见,仅使用整数,我想我可以自己弄清楚如何使用模板来完成它,如果需要的话),我可以重载运算符'',以使customVector 的实例可以在同一问题中初始化吗?这样我就可以写了

customVector myCustomVec = 1, 2, 3, 4

【问题讨论】:

不是运算符,因此不能重载。运营商是en.cppreference.com/w/cpp/language/expressions#Operators 您可以做vector 所做的事情,并添加一个带有initializer_list 参数的构造函数。 嗯,不,你不能重载 运算符,因为 不是运算符。为您的类提供一个接受 std::initializer_list&lt;something&gt; 参数的构造函数,其中 something 是对该类有意义的类型。 在旁注中,阅读XY problem。 (你的问题是一个。) 另见en.cppreference.com/w/cpp/utility/initializer_list,尤其是示例的S 【参考方案1】:

您可以完成您最终想要的事情,但不能通过重载任何运算符 - 不是运算符。

vector 通过使用带有 initializer_list 参数的构造函数来实现这一点,您可以对您的类执行相同的操作。

学习如何做并实施它作为练习。

【讨论】:

【参考方案2】:

你不能,因为 不是操作员。在 C++20 之前,以下运算符是可覆盖的:

+    -    *    /    %    ^    &    |    ~    !    =
<    >    +=   -=   *=   /=   %=   ^=   &=   |=   <<
>>   >>=  <<=  ==   !=   <=   >=   &&   ||   ++   --
,    ->*  ->   ()   []

C++20 添加了宇宙飞船操作员&lt;=&gt; 但我相信就是这样。

【讨论】:

【参考方案3】:

正如其他人所指出的, 不是运算符。但是,您仍然可以随意使用initializer list。它是标准库的一部分。

#include <iostream>
#include <initializer_list>
using namespace std;

template <typename T>
struct customVector 
    customVector(std::initializer_list<T> list) : size(list.size()) 
        arr = new T[size];
        int count = 0;
        for(auto val: list) arr[count++] = val;
    
    T* arr;
    std::size_t size;

    ~customVector() 
        for(int i = 0; i < size; i++)
            std::cout << arr[i] << std::endl;
        delete [] arr;
    
;

int main() 
    customVector<int> myCustomVec = 1, 2, 3, 4;

【讨论】:

以上是关于我该如何重载''运算符?的主要内容,如果未能解决你的问题,请参考以下文章

C++中如何重载输入输出流运算符使其可用于矩阵的输入输出?

如何创建运算符重载?

为啥会出现分段错误/如何重载运算符?

在这种情况下如何重载“+”运算符,

如何重载模板类的“新”运算符?

Powershell如何重载数组索引运算符?