2011-09-06 98 views
4
// By using structure :  
struct complex { 
    float real; 
    float imag; 
};  

complex operator+(complex, complex);  

main() { 
    complex t1, t2, t3;  
    t3 = t1 + t2;  
}  

complex operator+(complex w, complex z) { 
    statement 1;  
    statement 2; 
}  

// By using class :  
class complex { 
    int real; 
    int imag;  

public:  
    complex operator+(complex c) { 
    statement 1;  
    statement 2;  
    }  

    main() {  
    complex t1, t2, t3;  
    t3 = t1 + t2;  
    }  

当使用结构时,重载函数可以接受两个参数,而同时使用类重载函数接受只有一个参数,当重载操作功能是在这两种情况下的成员函数中结构,即以及在班上。为什么会发生?结构与类

+1

格式化您的代码,然后再问问题。 –

+0

您应该在每行之前放置四个空格来格式化代码。您也可以选择它并单击“{}”按钮。在[Markdown编辑帮助](http://stackoverflow.com/editing-help)页面提供更多有用的提示。 –

+0

问题是什么? – Seb

回答

3

...当重载运算符函数是在这两种情况下, 即结构以及类的成员函数...

是什么让你这么说?这不是真的。

在你的例子中struct的情况下,重载的运算符函数是而不是的成员。这就是为什么它需要2个参数。

所以,这个差别与struct和class的问题完全没有关系。你在这些运算符中有不同数量的参数的原因是第一个实现为非成员(因此有两个显式参数),而第二个实现为成员(因此只有一个显式参数)。

+0

+1:我意识到读完你的答案后才被问到:) –

10

这与类与结构无关。这是关于成员与非成员。

C++中的类和结构体完全不同于其成员和基础的默认可访问性级别(public为结构体,private为类)。除此之外,根本没有差别

重载操作符时,几乎总是可以选择将操作符定义为成员还是独立函数。只有4个运营商必须成为会员。它们是:(),[],->=(至于为什么,参见this question of mine)。其余的选择是你的。

这个优秀的FAQ entry解释(除其他外)如何选择成员与非成员之间。

要回答你的核心问题:在成员函数的情况下,第一agument是*this

+0

There's一个*惯用*差异。很多程序员在C++项目中使用'struct'作为未封装的POD,在有OOP时使用'class'。但是,不,除了默认的可访问性之外,没有任何技术上的不同。 – spraff

+0

@armen我已经明确写过重载函数在这两种情况下都是成员函数,即在结构体和类中 –

+0

@ desprado07:有人编辑了你的问题并删除了你原来写的内容。现在你的问题是不同的。上述阿门的答案是正确的,但它忽略了原始问题的重点。 – AnT

0

这是因为你用不同的方法来定义操作。当你使用struct时,你需要在struct之外定义它,但是当使用class时,你需要在类中定义运算符。

+0

这是他做了什么的描述,但没有说明他做错了什么,也没有说明如何解决它。 –

0

当您想要将两个参数传递给您的重载操作符+时,应该创建该类的朋友函数,然后将const complex& lhs, const complex& rhs作为参数传递。现在你可以有两个参数给你的operator+

operator+是类的成员时,一个arg作为this指针隐式传递。

+0

朋友功能不是必需的。只是回答问题。 –

+1

@ desprado07,我想你应该阅读阿尔门在答案中提供的常见问题。 –

-2

在第二个例子中,过载操作是类的成员函数,因此当这个操作符被调用时,它被称为第一操作数的一个成员函数和所述第一操作数因此隐含地作为对象给定在其上成员函数已被调用(如果你喜欢,指针为this)。

+0

虽然是正确的,但这是一个运行的句子,我不得不多次阅读,看它是否正确。 –

+0

@Mooing你发现结果是错的?或者它只是一个语法相关的downvote?虽然主要条款的积累可能被视为不良风格,但其内容的演绎过程是完全线性的。如果你不是downvoter,那么请原谅我责怪你。 –

+0

正如我所说的,结果是正确的。我的投诉仅仅是语法相关的。 –

-1
// 
complex operator +(cont complex& lhs, const complex& rhs) 
{ 
    ... 
} 

main() 
{ 
    complex t1,t2,t3;  
    t3=t1+t2; // i.e. t3 = operator+(t1, t2); 
} 

// 
class complex 
{ 
    int real,imag;  
public:  
    complex operator +(const complex& rhs){} 
}; 

main()  
{  
    complex t1,t2,t3;  
    t3=t1+t2; // i.e. t3 = t1.operator+(t2); 
}