2011-03-15 147 views
0

为什么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); 
} 
+0

向我们展示一些关于如何认为它可能工作的代码。最好的答案显示并说明OP正在尝试做什么,并在问题发布之前尝试过。 – 2011-03-15 02:36:35

+0

为什么?因为它的C++定义! – AbiusX 2011-03-15 02:37:39

回答

0

所有这些操作符(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? 
} 
+0

但我把“朋友”标识符放在该类中。 ? – user658266 2011-03-15 02:46:34

+0

@ user658266:'friend'关键字只告诉该函数可以访问该类的私有成员。它不会自动拥有'this'指针。也就是说,如果函数是'friend',那么你可以在函数定义中写入'obj.privateMember'。注意它正在访问私有成员,但它仍然需要知道'obj',以便它可以知道它正在执行哪个对象! – Nawaz 2011-03-15 02:48:32

+0

我觉得OP奇怪它为什么不能成为一个自由函数:'int&operator [](IntList&,size_t);'至少这是人们在问什么似乎是重复的问题:) :) – UncleBens 2011-03-15 07:33:57

0

他们有恰好一个参数,因为赋值运算符是二元运算符。左侧是要更改的对象,右侧是指定给左侧的对象。

它是非静态的,因为静态成员函数不是特定于该类的单个实例,而是通用于整个类。除了单个实例之外,对任何事物做任务是没有意义的。

0

赋值运算符(如果我没有错,你的意思是复制构造函数在内部)是特定于实例的。即每个对象的内容必须被复制/复制。所以它必须是非静态的。静态函数具有更全局的作用,所以它不能处理特定的实例。 总之,如果你有一个要求影响所有实例的功能,那么只有静态成员(变量和方法)必须被使用。如在计数器中保持当前可用对象的数量。

现在只有一个参数 - 这是因为你需要创建一个副本ofsomething(尽管它已经是一个类的对象内部具有多种数据类型,它是一个单一的对象只)

类似的(),[ ]和 - >是特定于实例的。

+0

我怀疑赋值运算符等于复制构造函数。 – user658266 2011-03-15 02:53:22

+0

考虑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