C++ 显式运算符+;在C++;

C++ 显式运算符+;在C++;,c++,operator-overloading,C++,Operator Overloading,我只是在玩+操作符&我不知道如何声明它并“显式”使用它 请帮助,代码如下: class compex{ int real; int img; public: compex(); compex(int,int); compex& explicit operator + (const compex& P1) friend ostream& operator <<(ostream& out,const co

我只是在玩+操作符&我不知道如何声明它并“显式”使用它 请帮助,代码如下:

class compex{

    int real;
    int img;

public:
    compex();
    compex(int,int);
    compex& explicit operator + (const compex& P1)
    friend ostream& operator <<(ostream& out,const compex& R);
};

explicit关键字仅对具有一个参数的构造函数有用。它将阻止编译器使用该构造函数进行转换。我不知道通过显式使用+运算符,您想要实现什么目标。:)

不能使(这些)运算符显式(C++11中只能使转换运算符显式)。你不需要这么做。只需通过以下方式避免显式转换为您的类型:

  • 未为其他类型定义转换运算符,以及
  • 标记可以用一个参数调用的复杂函数的所有构造函数
    explicit

这样,您可以有效地只使用已经复杂的类型调用
操作符+
,如果您想要一个
显式的转换函数,您将不得不为此编写一个函数(请参阅)(但它只适用于一个参数)

至于您的
操作符+(…)
,只需删除
explicit
,它就会工作

Compex c1(1,2);
Compex c2(3,12);
Compex c3 = c1 + c2;

如果要防止在使用
运算符+
时类型隐式转换为
compex
,可以利用模板参数

模板参数不直接受类型转换规则的约束

class compex{
    template<class C, 
             typename std::enable_if<std::is_same<C,complex>::value>::type >  
    compex& operator + (const C& P1)
    {
       // Your code
    }
};
class compex{
模板
compex和operator+(常数C和P1)
{
//你的代码
}
};

您是否收到错误?如果是,有什么错误?或者您还有其他问题要解决吗?您的问题是什么?您的代码有几个问题,请解释“显式”是什么意思,以及您有什么确切的问题。
+
运算符从不隐式使用。它是自动显式的。另外,您编写的代码实现了
+=
,而不是
+
。啊,来吧-不难猜测OP只是想在使用运算符+(operator+)时防止隐式转换。次要细节:如果其他构造函数有默认值,则显式也可以在具有多个参数的构造函数上使用,也就是说,当它可以像只有一个参数一样被调用时。此外,除了转换构造函数之外,还可以显式地使用转换运算符。@MooingDuck-是,但只能使用C++11。在C++ 03中,转换操作符不能被标记为显式的。不幸的是,C++还允许转换运算符作为全局函数,并作为成员函数在“从”类型中起作用。禁止转换到
复杂的
是一件棘手的事情,只有在试图只对
运算符+
强制执行时才更棘手。这不仅仅是针对具有一个参数的构造函数:@chris:很好,仍然缺少很多C++11知识:)我要补充一点。@Drew:我从来不知道可以将转换运算符作为全局函数。你会怎么做?
class compex{
    template<class C, 
             typename std::enable_if<std::is_same<C,complex>::value>::type >  
    compex& operator + (const C& P1)
    {
       // Your code
    }
};