运算符是否总是需要参数
Does operator have alway need to have arguments?
33 33 C:\Users\gauthjer\AppData\Local\Temp\Temp1_Ok.zip \rectangles.cpp[Error]"矩形运算符++()"必须具有类或枚举类型的参数
我创建了一个程序,后者想要注册一个编译器错误。我的问题是:超载运营商(越权)是否总是需要论据?
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
using namespace std ;
class rectangle{
double longueur;
double largeur;
public :
rectangle(double a = 0, double b = 0){ longueur = a; largeur = b; }
void setDimension(double longu, double larg);
double getLong() const;
double getLarg() const;
double surface() const;
double perimeter()const;
friend ostream & operator << (ostream &, const rectangle & flot);
friend istream & operator >> (istream &, rectangle & flot);
friend rectangle operator + (rectangle, rectangle);
friend rectangle operator * (rectangle, rectangle);
friend rectangle operator == (rectangle, rectangle);
friend rectangle operator != (rectangle, rectangle);
**friend rectangle operator ++ ();**
friend rectangle operator ++ (int);
};
// Je dois utiliser longu au lieu de long comme demande dans le tp - long est un type d'argument (comme double)
void rectangle :: setDimension(double longu, double larg) {
longueur = longu;
largeur = larg;
}
void rectangle :: getLong() const{
return longueur;
}
void rectangle :: getLarg() const{
return largeur;
}
void rectangle :: surface() const{
return longueur * largeur;
}
void perimeter :: perimeter() const{
return 2*longeur + 2*largeur;
}
ostream & operator << (ostream & sortie, const rectangle & flot){
sortie << "(" << flot.longueur << "," << flot.largeur << ")";
return sortie;
}
istream & operator >> (istream & entree, rectangle & flot){
char c = ' ';
int longueur, largeur;
bool ok = true;
entree >> c;
if(c != '(') ok = false;
else{
entree >> longeur >> c;
if (c != ',') ok = false;
else{
entree >> largeur >> c;
if (c != ')') ok = false;
}
}
if(ok) {flot.setDimension(longueur, largueur)}
else entree.clear(ios::badbit | entree.rdstate() );
return entree;
}
rectangle operator + (rectangle a, rectangle b){
rectangle rectangle1;
rectangle.longueur = a.longueur + b.longueur;
rectangle.largeur = b.largeur + b.largeur;
return rectangle1;
}
rectangle operator * (rectangle a, rectangle b){
rectangle rectangle1;
rectangle.longueur = a.longueur * b.longueur;
rectangle.largeur = b.largeur * b.largeur;
return rectangle1;
}
rectangle operator == (rectangle a, rectangle b){
if (a.longueur == b.longueur && a.largeur == b.largeur) return true;
else return false;
}
rectangle operator != (rectangle a, rectangle b){
if (a.longueur != b.longueur || a.largeur != b.largeur) return true;
else return false;
}
rectangle operator ++ (){
longueur ++ ; largeur++ ;
return *this ;
}
rectangle operator ++ (int n){
rectangle rectangle1 = *this ;
longueur++ ; largeur++ ;
return rectangle ;
}
修复前和修复后版本的operator++
最好都作为成员函数实现,而不是作为友元非成员实现,并且用于声明它们为非成员的签名是不正确的。
您应该删除friend
,使它们成为成员函数,并像这样定义它们:
rectangle& rectangle::operator ++() {
// ^ probably don't want to copy for pre-increment
//...
}
rectangle rectangle::operator ++(int) {
//...
}
运算符是否总是需要参数?
是的。c++中没有null运算符。即使在参数列表为空的rectangle::operator ++()
的情况下,也存在隐藏的参数,因为它是成员运算符。与成员函数一样,成员运算符也有一个隐藏的隐式对象参数。如果将运算符实现为firend,则该对象参数必须显式地成为参数列表的一部分。
如果要为rectangle
类型的预增量运算符定义重载,则重载必须具有该类型的单个参数。就像任何其他预增量运算符的过载一样:
friend rectangle operator ++(rectangle&);
或者将其声明为成员函数,在这种情况下,隐式对象参数是唯一的参数。
相关文章:
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 如何检查给定的参数是否为 cv::noArray()?
- 如果返回 -1,时间() 的参数是否被修改?
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?
- 检查两个模板参数是否相同
- 空函数的参数是否加载到缓存中?
- 使用 lambda 作为构造函数参数是否需要C++ 17?
- 了解'this'或其他参数是否为右值
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- shared_ptr构造函数参数是否应按值传递
- 如何检查模板参数是否为给定值?
- 使用聚合初始化模拟默认函数参数是否存在任何陷阱?
- 在对象序列化期间添加额外参数是否有更好的方法?
- 通过 ssh 发送参数.是否有非阻塞输入函数?
- 如何检查运算符 != 模板参数是否存在 C++ 17?
- 常量引用函数参数:是否可以禁止临时对象?
- 如何检查模板参数是否为 std::variant?
- 是否可以确定函数的参数是否已签名或无符号,以实现可能性超载函数
- 移动 l 值参考参数是否是一种不好的做法?
- 显式指定通用 lambda 的 operator() 模板参数是否合法?