C++约运算符重载
为什么C++约运算符重载
赋值运算符必须是 非静态成员函数
运营商(),操作符[],并且操作符 - > 也必须被实现为非易失静态 成员函数。
例如
class IntList
{
private:
int m_anList[10];
public:
int& operator[] (const int nIndex);
};
int& IntList::operator[] (const int nIndex)
{
return m_anList[nIndex];
}
这是下标过载。它只能通过使用成员函数来重载。 它不能使用友元函数,如 超载,
class Cents
{
private:
int m_nCents;
public:
Cents(int nCents) { m_nCents = nCents; }
// Overload -cCents
friend Cents operator-(const Cents &cCents);
};
// note: this function is not a member function!
Cents operator-(const Cents &cCents)
{
return Cents(-cCents.m_nCents);
}
所有这些操作符(operator=
,operator()
,operator[]
和operator->
)上的定义,这些运营商非类的一个实例被调用静态成员函数!
静态成员或非成员函数就像自由函数一样。他们不会被调用到类的实例上。
例如,如果你让operator[]
静态函数,那么你没有this
指针里面,那么函数不知道哪个实例是应该采取行动:
//illegal code
static int& IntList::operator[] (const int nIndex)
{
return m_anList[nIndex]; //of which instance this `m_anList` is a member?
}
但我把“朋友”标识符放在该类中。 ? – user658266 2011-03-15 02:46:34
@ user658266:'friend'关键字只告诉该函数可以访问该类的私有成员。它不会自动拥有'this'指针。也就是说,如果函数是'friend',那么你可以在函数定义中写入'obj.privateMember'。注意它正在访问私有成员,但它仍然需要知道'obj',以便它可以知道它正在执行哪个对象! – Nawaz 2011-03-15 02:48:32
我觉得OP奇怪它为什么不能成为一个自由函数:'int&operator [](IntList&,size_t);'至少这是人们在问什么似乎是重复的问题:) :) – UncleBens 2011-03-15 07:33:57
他们有恰好一个参数,因为赋值运算符是二元运算符。左侧是要更改的对象,右侧是指定给左侧的对象。
它是非静态的,因为静态成员函数不是特定于该类的单个实例,而是通用于整个类。除了单个实例之外,对任何事物做任务是没有意义的。
赋值运算符(如果我没有错,你的意思是复制构造函数在内部)是特定于实例的。即每个对象的内容必须被复制/复制。所以它必须是非静态的。静态函数具有更全局的作用,所以它不能处理特定的实例。 总之,如果你有一个要求影响所有实例的功能,那么只有静态成员(变量和方法)必须被使用。如在计数器中保持当前可用对象的数量。
现在只有一个参数 - 这是因为你需要创建一个副本ofsomething(尽管它已经是一个类的对象内部具有多种数据类型,它是一个单一的对象只)
类似的(),[ ]和 - >是特定于实例的。
我怀疑赋值运算符等于复制构造函数。 – user658266 2011-03-15 02:53:22
考虑class MyClass {....}; MyClass obj1(10); MyClass obj2 = obj1;现在这里的意思是Obj2与obj1是类似的(即复制状态)......赋值运算符不是一对一的复制构造函数,但可以在内部使用它。 http://en.wikipedia.org/wiki/Assignment_operator_(C%2B%2B) – Abhi 2011-03-15 04:29:45
向我们展示一些关于如何认为它可能工作的代码。最好的答案显示并说明OP正在尝试做什么,并在问题发布之前尝试过。 – 2011-03-15 02:36:35
为什么?因为它的C++定义! – AbiusX 2011-03-15 02:37:39