C++ 过载问题<;C+中的运算符+;
我有一个学生对象向量,我想使用C++ 过载问题<;C+中的运算符+;,c++,operator-overloading,C++,Operator Overloading,我有一个学生对象向量,我想使用#include和排序(list.begin(),list.end())对其进行排序 为了做到这一点,我知道我需要重载“嗯,你可以作为一个内部操作符: class Student { public: bool operator <(const Student& second) const; ... private: ... }; 班级学生 { 公众: bool操作符我不会在这里使用朋友,我也不确定它是否有效。我
#include
和排序(list.begin(),list.end())对其进行排序代码>
为了做到这一点,我知道我需要重载“嗯,你可以作为一个内部操作符:
class Student
{
public:
bool operator <(const Student& second) const;
...
private:
...
};
班级学生
{
公众:
bool操作符我不会在这里使用朋友,我也不确定它是否有效。我会使用的是
class Student
{
public:
bool operator< (const Student& second) const;
};
bool Student::operator< (const Student& second) const
{
return (Name() < second.Name());
}
班级学生
{
公众:
布尔运算符<(常数学生和第二个)常数;
};
bool Student::运算符<(const Student和second)const
{
返回(Name()
注意尾随的const,表示在操作符中没有说明使用的编译器,但我怀疑您使用的是一个相当新的编译器,它实现了“friend is not a declaration”“规则。类中的friend语句不作为函数声明;包含Student.h的其他模块看不到函数的任何声明。它仅在Student.cpp文件中可见。(较旧的编译器没有此规则,将friend声明视为函数声明。)
函数不需要是朋友,因为它不使用Student类的任何私有成员(我假设Name()是公共的)。将函数声明移到类之外,并将“friend”替换为“extern”,它应该可以工作
正如上面一些海报所建议的那样,可以将运算符设置为成员函数,但这不是必需的。通常不赞成将运算符设置为成员函数,因为这意味着这两个参数没有对称处理(一个是不可见的“this”参数,另一个是普通函数参数),这在某些情况下可能会导致令人惊讶的结果(例如,可能会对参数应用不同的类型转换)。顺便说一句,对于这么简单的函数,我个人只会这样做,除非样式指南禁止在类定义中定义函数:
class Student
{
friend bool operator <(const Student& first, const Student& second)
{
return first.Name() < second.Name();
}
...
};
班级学生
{
friend bool运算符是否有必要标记函数声明extern?我只在头文件中声明了变量。很难为这个问题确定一个答案。我最初的尝试都是在类中定义的,我只是在阅读了某人的声明后出于绝望才尝试了“friend”版本除非您这样做,“排序”不会生效。事实证明,我实际上也有一个与指针相关的问题。没错,这并不是真的必要;类外的函数默认有外部链接。我习惯于将其放进去,以向读者表明该函数是在另一个源文件中定义的(而不是同一文件中其他地方定义的函数的前向声明)@Ross-我理解这种皱眉,但我个人对编写标准的人皱眉。逻辑上对称的方法是有一个静态成员函数,但显然这是不允许的。无论如何,我的习惯是因为朋友方法的问题而形成的-这些问题现在可能已经过去了,但我目前的习惯不会导致我e任何问题。在我看来,“如果它没有坏,就不要改正它”也适用于习惯。似乎很可能是“第一个”和“第二个”"friend版本中的参数是const。我想我最终决定将其作为我将选择的答案,因为它最直接地引导我识别指针的更大问题。这种方法通常是避免的,因为如果类型可转换为Student,代码将转换右侧类型,而不是left-side类型。一个friend函数将在两侧保持一致的行为。
class Student
{
public:
bool operator< (const Student& second) const;
};
bool Student::operator< (const Student& second) const
{
return (Name() < second.Name());
}
class Student
{
friend bool operator <(const Student& first, const Student& second)
{
return first.Name() < second.Name();
}
...
};