Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 成员函数与运算符重载_C++_Operator Overloading_Member Functions - Fatal编程技术网

C++ 成员函数与运算符重载

C++ 成员函数与运算符重载,c++,operator-overloading,member-functions,C++,Operator Overloading,Member Functions,若编程语言允许,我应该总是重载运算符,还是最好创建一个成员函数 例如: bool运算符==(…){…} 或 bool equals(…){…}如果运算符直接映射到函数的含义,则建议使用该运算符,例如 =而不是等于,因为它比较相等 +而不是添加,如果它正在添加例如数学向量 但如果是添加到列表中,则不要使用+而不是添加 如果运算符直接映射到函数的含义,则建议使用运算符,例如 =而不是等于,因为它比较相等 +而不是添加,如果它正在添加例如数学向量 但如果是添加到列表中,则不要使用+而不是添加 只有

若编程语言允许,我应该总是重载运算符,还是最好创建一个成员函数

例如:
bool运算符==(…){…}

bool equals(…){…}

如果运算符直接映射到函数的含义,则建议使用该运算符,例如

  • =
    而不是
    等于
    ,因为它比较相等
  • +
    而不是
    添加
    ,如果它正在添加例如数学向量
  • 但如果是添加到列表中,则不要使用
    +
    而不是
    添加

如果运算符直接映射到函数的含义,则建议使用运算符,例如

  • =
    而不是
    等于
    ,因为它比较相等
  • +
    而不是
    添加
    ,如果它正在添加例如数学向量
  • 但如果是添加到列表中,则不要使用
    +
    而不是
    添加

只有在完全清楚它的作用时,我才会这样做。对于读取代码,最好避免重载。因为你的大脑是用来读单词的,而不是一些操作员。有时操作员可以做一些不同于您所猜测的事情。但我觉得
==
已经足够清楚了


如果运算符在某些库中用作回调,则可以很好地使用它们。e、 g.
std::sort
。你可以定义你的
操作符我只会在完全清楚它的作用的情况下才这么做。对于读取代码,最好避免重载。因为你的大脑是用来读单词的,而不是一些操作员。有时操作员可以做一些不同于您所猜测的事情。但我觉得
==
已经足够清楚了


如果运算符在某些库中用作回调,则可以很好地使用它们。e、 g.
std::sort
。您可以定义
运算符,作为其他答案的补充:

在我看来,非成员运算符==和成员运算符==或某种equals方法之间的主要区别在于,在比较类/结构的对象时,有机会使用隐式转换

因此,如果您有一些结构
X

struct X {
    X() = default;
    X(int) {}
};
bool operator==(const X&, const X&) {
    // some logic here
}
您可以为
X
定义一个非成员运算符==:

struct X {
    X() = default;
    X(int) {}
};
bool operator==(const X&, const X&) {
    // some logic here
}
然后使用隐式转换:

X x;
std::cout << (42 == x) << " " << (x == 42) << std::endl;
X;

std::cout作为其他答案的补充:

在我看来,非成员运算符==和成员运算符==或某种equals方法之间的主要区别在于,在比较类/结构的对象时,有机会使用隐式转换

因此,如果您有一些结构
X

struct X {
    X() = default;
    X(int) {}
};
bool operator==(const X&, const X&) {
    // some logic here
}
您可以为
X
定义一个非成员运算符==:

struct X {
    X() = default;
    X(int) {}
};
bool operator==(const X&, const X&) {
    // some logic here
}
然后使用隐式转换:

X x;
std::cout << (42 == x) << " " << (x == 42) << std::endl;
X;
std::这里是否没有“始终”答案?但是如果重载运算符足够直观,则通常认为它是一个好的重载。这里是否没有“始终”答案?但是如果重载运算符足够直观,则通常认为它是一个好的重载