成员函数、-c++用成员函数和友元函数实现复数的加减操作,产生了二义性,麻烦各位大哥大姐解答一下,感激不尽

问题描述

c++用成员函数和友元函数实现复数的加减操作,产生了二义性,麻烦各位大哥大姐解答一下,感激不尽

我想在一个程序中用友元函数和类的成员函数实现复数的加减操作,
类中这样定义:

main函数中用这几句调用的话存在二义性:

c3=c1+c2;这一句就不知道到底该调用成员函数还是调用友元函数,但是重载的话只有参数类型和参数个数不同,就应该没问题的,这里该怎么解决呢?
麻烦各位大哥大姐了;下面是程序的代码,

#include

class Complex
{
public:
Complex(double r=0.0,double i=0.0):real(r),imag(i){}
Complex operator+ (const Complex &c2)const;
Complex operator- (const Complex &c2)const;

    friend Complex operator+(const Complex &c1,const Complex &c2);
    friend Complex operator-(const Complex &c1,const Complex &c2);

    friend ostream &operator<< (ostream &out,const Complex &c);
    void display()const;
private:
    double real;
    double imag;

} ;

Complex Complex::operator+ (const Complex &c2)const
{
return Complex(real+c2.real,imag+c2.imag);
}
Complex Complex::operator- (const Complex &c2)const
{
return Complex(real-c2.real,imag-c2.imag);
}

void Complex::display()const
{
cout<<"("<<real<<","<<imag<<")"<<endl;
}

Complex operator+(const Complex &c1,const Complex &c2)
{
return Complex(c1.real+c2.real,c1.imag+c2.imag);
}
Complex operator-(const Complex &c1,const Complex &c2)
{
return Complex(c1.real-c2.real,c1.imag-c2.imag);
}
ostream &operator<< (ostream &out,const Complex &c)
{
out<<"("<<c.real<<","<<c.imag<<")"<<endl;
return out;
}

int main()
{
Complex c1(5,4),c2(2,10),c3;
c1.display();
c2.display();
c3.display();

c3=c1+c2;
c3.display();
cout<<c3;

c3=c3-c1;
c3.display();
cout<<c3;

return 0;

}

解决方案

你在函数里写个输出就能看出优先级了,具体我也没试过,无法给出正确答案

解决方案二:

 c3=c1+c2;//对象+对象
 用成员函数 Complex operator+ (const Complex &c2)const;

 c3=4+c2; //数+对象
 用友元函数
 friend Complex operator+ (double r, const Complex &c2);

解决方案三:


谢谢两位哈,太感谢了,我用这种方式消除了二义性;
真正写代码的时候肯定不会这么用的,我只是想知道该怎么消除二义性。谢谢两位哈

解决方案四:

#include
using namespace std;

class Complex
{
public:
Complex(double r = 0.0, double i = 0.0) :real(r), imag(i){}
//Complex operator+ (const Complex &c2)const;
//Complex operator- (const Complex &c2)const;
friend Complex operator+(const Complex &c1, const Complex &c2);
friend Complex operator-(const Complex &c1, const Complex &c2);

friend ostream &operator<< (ostream &out, const Complex &c);
void display()const;

private:
double real;
double imag;
};
//Complex Complex::operator+ (const Complex &c2)const
//{
// return Complex(real + c2.real, imag + c2.imag);
//}
//Complex Complex::operator- (const Complex &c2)const
//{
// return Complex(real - c2.real, imag - c2.imag);
//}
void Complex::display()const
{
cout << "(" << real << "," << imag << ")" << endl;
}
Complex operator+(const Complex &c1, const Complex &c2)
{
return Complex(c1.real + c2.real, c1.imag + c2.imag);
}
Complex operator-(const Complex &c1, const Complex &c2)
{
return Complex(c1.real - c2.real, c1.imag - c2.imag);
}
ostream &operator<< (ostream &out, const Complex &c)
{
out << "(" << c.real << "," << c.imag << ")" << endl;
return out;
}

int main()
{
Complex c1(5, 4), c2(2, 10), c3;
c1.display();
c2.display();
c3.display();
c3 = c1 + c2;
c3.display();
cout << c3;

c3 = c3 - c1;
c3.display();
cout << c3;

return 0;

}

你这样写必然产生二义性...弄清楚什么事表像,什么事本质...

时间: 2024-08-04 08:42:34

成员函数、-c++用成员函数和友元函数实现复数的加减操作,产生了二义性,麻烦各位大哥大姐解答一下,感激不尽的相关文章

ASP 中 DateDiff 函数详解 主要实现两日期加减操作_ASP基础

ASP 中 DateDiff 函数详解DateDiff 函数  描述  返回两个日期之间的时间间隔.  语法  DateDiff(interval, date1, date2 [,firstdayofweek][, firstweekofyear]])  DateDiff 函数的语法有以下参数:  参数 描述  interval 必选.字符串表达式,表示用于计算 date1 和 date2 之间的时间间隔.有关数值,请参阅"设置"部分.  date1, date2 必选.日期表达式.用

ASP 中 DateDiff 函数详解 主要实现两日期加减操作

ASP 中 DateDiff 函数详解 DateDiff 函数 描述  返回两个日期之间的时间间隔.  语法  DateDiff(interval, date1, date2 [,firstdayofweek][, firstweekofyear]])  DateDiff 函数的语法有以下参数: 参数 描述  interval 必选.字符串表达式,表示用于计算 date1 和 date2 之间的时间间隔.有关数值,请参阅"设置"部分.  date1, date2 必选.日期表达式.用于

【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数

类的成员函数与const-mutable  成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);

C++学习摘要之六:友元函数与友元类

采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为 公有的,依此提供类与外界间的通信接口.但是,有时需要定义一些函数,这些函数不是类的一部分,但 又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数.除了友元函数外,还有 友元类,两者统称为友元.友元的作用是提供了工序的运行效率,但又破坏了类的封装性. 1.友元函数 友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类 ,但需要在类的定义中加以声明,声明时

C++之:友元函数

一.定义 友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下: friend 类型 函数名(形式参数); 友元提供了不同类的成员函数之间.类的成员函数与一般函数之间进行数据共享的机制.通过友元,一个不同函数或另一个类中的成员函数可以访问类中的私有成员和保护成员.c++中的友元为封装隐藏这堵不透明的墙开了一个小孔,外界可以通过这个小孔窥视内部的秘密. 友元的正确使用能提高程

关于C++中的友元函数的总结

1.友元函数的简单介绍 1.1为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率.如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数.具体来说:为了 使其他类的成员函数直接访问该类的私有变量.即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数. 实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元.(2)两个类要共享数据的时候. 1.2使用友元函数的优缺点 1.2.1优点:能

剖析C++编程中friend关键字所修饰的友元函数和友元类_C 语言

在某些情况下,为不是类成员的函数或单独类中的所有函数授予成员级别的访问权会更方便.仅类实现器可以声明其友元.函数或类不能将其自身声明为任何类的友元.在类声明中,使用 friend 关键字和非成员函数名称或其他类,以允许其访问你的类的专用和受保护成员.语法 friend class-name; friend function-declarator; 友元声明如果声明以前未声明的友元函数,则该函数将被导出到封闭非类范围. 友元声明中声明的函数被视为已使用 extern 关键字声明.(有关 exter

简要介绍C++编程中的友元函数和友元类_C 语言

一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员.现在,我们来补充介绍一个例外--友元(friend). fnend 的意思是朋友,或者说是好友,与好友的关系显然要比一般人亲密一些.有的家庭可能会这样处理:客厅对所有来客开放,而卧室除了本家庭的成员可以进人以外,还允许好朋友进入.在C++中,这种关系以关键宇 friend 声明,中文多译为友元.友元可以访问与其有好友关系的类

C++之友元:友元函数和友元类详解_C 语言

一.友元介绍我们知道,类的成员函数可以访问同类的其他成员函数,包括公有.私有和保护成员.而类的外部函数只能访问类的公有成员. 友元是一种允许非类成员函数访问类的非公有成员的一种机制.可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元. 友元函数友元类 二.友元函数友元函数在类作用域外定义,但它需要在类体中进行说明为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数,格式如下: friend  类型 友元函数名(参数表);友元的作用在于提高程序的运行效率 友