c++ 重载比较运算符
C++operator关键字(重载操作符)

C++operator关键字(重载操作符)operator是C++的关键字,它和运算符⼀起使⽤,表⽰⼀个运算符函数,理解时应将operator=整体上视为⼀个函数名。
这是C++扩展运算符功能的⽅法,虽然样⼦古怪,但也可以理解:⼀⽅⾯要使运算符的使⽤⽅法与其原来⼀致,另⼀⽅⾯扩展其功能只能通过函数的⽅式(c++中,“功能”都是由函数实现的)。
⼀、为什么使⽤操作符重载?对于系统的所有操作符,⼀般情况下,只⽀持基本数据类型和标准库中提供的class,对于⽤户⾃⼰定义的class,如果想⽀持基本操作,⽐如⽐较⼤⼩,判断是否相等,等等,则需要⽤户⾃⼰来定义关于这个操作符的具体实现。
⽐如,判断两个⼈是否⼀样⼤,我们默认的规则是按照其年龄来⽐较,所以,在设计person 这个class的时候,我们需要考虑操作符==,⽽且,根据刚才的分析,⽐较的依据应该是age。
那么为什么叫重载呢?这是因为,在编译器实现的时候,已经为我们提供了这个操作符的基本数据类型实现版本,但是现在他的操作数变成了⽤户定义的数据类型class,所以,需要⽤户⾃⼰来提供该参数版本的实现。
⼆、如何声明⼀个重载的操作符?A: 操作符重载实现为类成员函数重载的操作符在类体中被声明,声明⽅式如同普通成员函数⼀样,只不过他的名字包含关键字operator,以及紧跟其后的⼀个c++预定义的操作符。
可以⽤如下的⽅式来声明⼀个预定义的==操作符:class person{private:int age;public:person(int a){this->age=a;}inline bool operator == (const person &ps) const;};实现⽅式如下:inline bool person::operator==(const person &ps) const{if (this->age==ps.age)return true;return false;}调⽤⽅式如下:#includeusing namespace std;int main(){person p1(10);person p2(20);if(p1==p2) cout<<”the age is equal!”< return 0;}这⾥,因为operator ==是class person的⼀个成员函数,所以对象p1,p2都可以调⽤该函数,上⾯的if语句中,相当于p1调⽤函数==,把p2作为该函数的⼀个参数传递给该函数,从⽽实现了两个对象的⽐较。
C++基础系列——运算符重载

C++基础系列——运算符重载1. 运算符重载简介所谓重载,就是赋予新的含义。
函数重载(Function Overloading)可以让⼀个函数名有多种功能,在不同情况下进⾏不同的操作。
同样运算符重载(Operator Overloading)可以让同⼀个运算符可以有不同的功能。
可以对 int、float、string 等不同类型数据进⾏操作<< 既是位移运算符,⼜可以配合 cout 向控制台输出数据也可以⾃定义运算符重载:class Complex{public:Complex();Complex(double real, double imag);Complex operator+(const Complex &a) const;void display() const;private:double m_real;double m_imag;};// ...// 实现运算符重载Complex Complex::operator+(const Complex &A) const{Complex B;B.m_real = this->m_real + A.m_real;B.m_imag = this -> m_imag + A.m_imag;return B;// return Complex(this->m_real + A.m_real, this->m_imag + A.m_imag);}int main(){Complex c1(4.3, 5.8);Complex c2(2.7, 3.7);Complex c3;c3 = c1 + c2; // 运算符重载c3.display();return 0;}运算结果7 + 9.5i运算符重载其实就是定义⼀个函数,在函数体内实现想要的功能,当⽤到该运算符时,编译器会⾃动调⽤这个函数,它本质上是函数重载。
C++笔记——在模板类中重载操作符

C++笔记 ——在模板类中重载操作符
实现了一个Matrix模板类,以此为例记录一下在模板类中重载常用的运算符。
不是所有运算符都可以重载,不能被重载的运算符有:长度运算符sizeof,条件运算符?,成员选择运算符.,域解析运算符::
23 Matirx<T> operator+(T1 a){
24
Matirx<T> temp(row, col);
25
for(int i = 0; i < row * col; i++)
26
values[i] += (T)a;
27
return temp;
28 }
29
30 template <typename T1>
9
Matirx<T> tmp(1, col);
10
for(int i = 0; i < col; ++i)
11
tmp.values[i] = values[(r - 1) * col + i];
12
return tmp;
13 }
10.其他
除了面提到的运算符,常用的运算符还有复合运算符(比如+=,*=)和方括号运算符[](用于支持随机访问)以及delete和delete[] 运算符, 由于这些运算符重载方式都大同小异,基本上能在以上的几种中找到差不多的例子,不再赘述。
重载操作符需要特别注意的一点是函数的参数表和返回值的形式。
重载操作符有两种方法,一种是重载为成员函数,一种是重载为友元。
可以重载的运算符

可以重载的运算符随着程序设计语言的发展,越来越多的重载运算符的机会出现。
通过重载运算符,可以方便地对自定义类型进行操作,并提高代码的可读性和可维护性。
以下是一些可以重载的运算符:1. 一元运算符:重载一元运算符可以改变一个对象的状态或值。
常见的一元运算符包括:+(正号)、-(负号)、*(指针)、&(取地址符)、~(按位取反)等。
2. 二元运算符:重载二元运算符可以改变两个对象之间的运算方式。
常见的二元运算符包括:+(加号)、-(减号)、*(乘号)、/(除号)等。
在C++中,还可以重载操作符用于比较操作,如==、!=、<=、>=等。
3. 赋值运算符:重载赋值运算符可以对自定义类型进行赋值操作。
默认的赋值运算符只是简单地复制对象的值,而且会存在浅拷贝和深拷贝的问题。
4. 下标运算符:重载下标运算符可以通过对象数组形式来访问对象中的元素。
这种运算符对于自定义容器和数据结构非常有用。
5. 函数调用运算符:重载函数调用运算符可以让对象具有函数行为。
通过这种方式,可以实现自定义类型的函数调用和参数传递。
6. 前置/后置增量运算符:重载前置/后置增量运算符可以使得对象的值增加或减少。
前置增量运算符在对象的值被使用之前首先递增对象的值,而后置增量运算符在对象的值被使用后递增对象的值。
7. 强制类型转换运算符:重载强制类型转换运算符可以将自定义类型转换为其他数据类型,例如将一个类的对象转换为bool值或整数值等。
通过重载运算符,可以轻松地实现自定义类型的强类型检查和操作。
但是,在重载运算符时应该注意保持一致性和正确性,以确保代码的正确性和可维护性。
C 的高级特性---函数重载,重写,覆盖

C++语言采用重载机制的另一个理由是:类的构造函数需要重载机制。因为C++规定构造函数与类同名(请参见第9章),构造函数只能有一个名字。如果想用几种不同的方法创建对象该怎么办?别无选择,只能用重载机制来实现。所以类可以有多个同名的构造函数。
8.1.2 重载是如何实现的?
int x = Function ();
则可以判断出Function是第二个函数。问题是在C++/C程序中,我们可以忽略函数的返回值。在这种情况下,编译器和程序员都不知道哪个Function函数被调用。
所以只能靠参数而不能靠返回值类型的不同来区分重载函数。编译器根据参数为每个重载函数产生不同的内部标识符。例如编译器为示例8-1-1中的三个Eat函数产生象_eat_beef、_eat_fish、_eat_chicken之类的内部标识符(不同的编译器可能产生不同风格的内部标识符)。
{
void foo(int x, int y);
… // 其它函数
}或者写成
extern “C”
{
#include “myheader.h”
… // 其它C头文件
}
这就告诉C++编译译器,函数foo是个C连接,应该到库中找名字_foo而不是找_foo_int_int。C++编译器开发商已经对C标准库的头文件作了extern“C”处理,所以我们可以用#include 直接引用这些头文件。注意并不是两个函数的名字相同就能构成重载。全局函数和类的成员函数同名不算重载,因为函数的作用域不同。例如:
示例8-2-1中,函数Base::f(int)与Base::f(float)相互重载,而Base::g(void)被Derived::g(void)覆盖。
c++学习资料第 06 章 运算符重载

第 6 章 运 算 符 重 载
{ return Complex( c.Real, c.Image ); } void Complex::print()const { cout << '(' << Real << " , " << Image << ')' << endl; } void main() { Complex c1( 2.5,3.7 ), c2( 4.2, 6.5 ) ; Complex c ; c = c1 c2 ; // operator(c1,c2) c.print() ; c = 25 + c2 ; // operator+(25,c2) c.print() ; c = c2 + 25 ; // operator+(c2,52) c.print() ; c = c1 ; // operator(c1) c.print() ; } 当一个运算符的操作需要修改类对象状态时,应该以成员函数重载。例如,需要左值操 作数的运算符(如 =,*=,++ 等)应该用成员函数重载。如果以友员函数重载,可以使用 引用参数修改对象。 当运算符的操作数(尤其是第一个操作数)希望有隐式转换,则重载算符时必须用友员 函数或普通函数。 C++中不能用友员函数重载的运算符有 = () [] -> 6.3 几个典型运算符重载 本节讨论在数学类中常用的几个运算符重载的特点和应用。 6.3.1 重载 ++ 与 自增和自减运算符有前置和后置两种形式。每个重载运算符的函数都必须有明确的特 征,使编译器确定要使用的版本。C++规定,前置形式重载为一元运算符函数,后置形式重 载为二元运算符函数。 【例 64】例 62 中使用了成员函数重载++和运算符。本例用友员函数重载++运算符。 设有简单类定义 class Increase { public : Increase() ; … friend Increase operator ++ ( Increase & ) ; friend Increase operator ++ ( Increase & , int ) ; private : unsigned value ; } ; 则前置重载的实现为: Increase operator++ ( Increase & a ) { a.value ++ ;
C++运算符重载讲解与经典实例 (2)

5.重载运算符有哪些限制:
(1)不可臆造新的运算符。必须把重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中。
(c1+c2)*(c1-c2)*c2/c1=9.61538+25.2308i
在程序中,类complex定义了4个成员函数作为运算符重载函数。将运算符重载函数说明为类的成员函数格式如下:
<类名>operator<运算符>(<参数表>)
其中,operator是定义运算符重载函数的关键字。
程序中出现的表达式:
位操作运算符:&,|,~,^,<<,>>
逻辑运算符:!,&&,||;
比较运算符:<,>,>=,<=,==,!=;
赋值运算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;
其他运算符:[],(),->,,(逗号运算符),new,delete,new[],delete[],->*。
double real;
double imag;
};
complex a(10,20),b(5,8);
“a+b”运算如何实现?这时候我们需要自己编写程序来说明“+”在作用于complex类对象时,该实现什么样的功能,这就是运算符重载。运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为。
运算符重载形式有两种,重载为类的成员函数和重载为类的友元函数。
运算符重载为类的成员函数的一般语法形式为:
c++结构体重载运算符

c++结构体重载运算符C++结构体可以通过重载运算符来实现自定义的操作符行为。
重载运算符允许我们使用结构体对象与其他对象之间进行类似于内置数据类型的操作。
下面将介绍一些常用的运算符重载的方式以及其使用场景。
1. 算术运算符重载:- 重载+运算符:可以用于结构体对象之间的相加操作。
- 重载-运算符:可以用于结构体对象之间的相减操作。
- 重载*运算符:可以用于结构体对象与标量之间的乘法运算。
- 重载/运算符:可以用于结构体对象与标量之间的除法运算。
2. 关系运算符重载:- 重载==运算符:用于比较两个结构体对象是否相等。
- 重载!=运算符:用于比较两个结构体对象是否不相等。
- 重载<运算符:用于比较两个结构体对象的大小关系。
- 重载>运算符:用于比较两个结构体对象的大小关系。
- 重载<=运算符:用于比较两个结构体对象的大小关系。
- 重载>=运算符:用于比较两个结构体对象的大小关系。
3. 赋值运算符重载:- 重载=运算符:用于将一个结构体对象的值赋给另一个对象。
- 重载+=运算符:用于将一个结构体对象与另一个对象相加,并将结果赋给第一个对象。
- 重载-=运算符:用于将一个结构体对象与另一个对象相减,并将结果赋给第一个对象。
- 重载*=运算符:用于将一个结构体对象与标量相乘,并将结果赋给第一个对象。
- 重载/=运算符:用于将一个结构体对象与标量相除,并将结果赋给第一个对象。
4. 输入输出运算符重载:- 重载<<运算符:用于将结构体对象的数据输出到标准输出流。
- 重载>>运算符:用于从标准输入流中读取数据,并赋给结构体对象的成员变量。
运算符重载的基本语法如下:```返回类型 operator运算符(参数列表) {// 重载运算符的实现代码// 可以直接访问结构体对象的成员变量// 可以调用结构体对象的方法// 可以与其他对象进行运算// 返回运算结果}```在进行运算符重载时,需要注意以下几点:- 重载运算符必须是成员函数或友元函数。
operator用法

operator用法operator是C++中的一个关键字,表示操作符的重载函数。
操作符重载可以使得类类型的对象可以像基本数据类型一样使用运算符进行操作。
以下是operator的用法:1.重载算术运算符:可以重载+、-、*、/等算术运算符。
例如:```c++。
public:。
double real, imag;。
}。
};。
```。
这个重载函数将实现复数相加的运算。
2.重载比较运算符:可以重载==、!=、>、<等比较运算符。
例如:```c++。
class String 。
public:。
bool operator==(const String& t) const 。
//比较字符串是否相等。
}。
};。
```。
这个重载函数将实现字符串相等比较的运算。
3.重载逻辑运算符:可以重载&&、||、!等逻辑运算符。
例如:```c++。
class MyBool 。
public:。
bool operator!() const 。
//取反运算。
}。
};。
```。
这个重载函数将实现MyBool类型的取反运算。
4.重载赋值运算符:可以重载=运算符。
例如:```c++。
class String 。
public:。
String& operator=(const String& t) 。
//字符串赋值运算。
return *this;。
}。
};。
```。
这个重载函数将实现字符串的赋值运算。
5.重载下标运算符:可以重载[]运算符。
例如:```c++。
class Array 。
public:。
int& operator[](int i) 。
//返回第i个元素的引用。
}。
};。
```。
这个重载函数将实现数组的下标运算。
6.重载函数调用运算符:可以重载()运算符。
例如:```c++。
class Function 。
public:。
int operator()(int x, int y) 。
C++运算符重载三种形式(成员函数,友元函数,普通函数)详解

C++运算符重载三种形式(成员函数,友元函数,普通函数)详解三种重载⽅式⾸先,介绍三种重载⽅式:1//作为成员函数重载(常见)2class Person{3 Private:4string name;5int age;6public:7 Person(const char* name, int age):name(name),age(age){}8bool operator<(const Person& b);910 };11bool Person::operator<(const Person& b)12 {13//作为成员函数时,*this即为左操作数a14 ...15 }1//作为友元函数重载2class Person{3private:4string name;5int age;6public:7 Person(const char* name, int age):name(name),age(age){}8 friend bool operator<(const Person& a,const Person& b);910 };11bool operator<(const Person& a,const Person& b)12 {13 ...14 }1//作为普通函数重载(不推荐)2class Person{3public://注意,重载运算符为普通函数时,使⽤到的类成员必须为public4string name;5int age;6public:7 Person(const char* name, int age):name(name),age(age){}89 };10bool operator<(const Person& a,const Person& b)11 {12 ...13 }作为成员函数重载先介绍第⼀种:bool Person::operator<(const Person& b),bool是函数返回类型,Person::只是指定了成员函数所属类名。
C#高编-运算符和类型强制转换

C#⾼编-运算符和类型强制转换摘要C#中的运算符处理引⽤类型和值类型时相等的含义基本数据类型之间的数据转换使⽤装箱技术把值类型转换为引⽤类型通过类型强制转换在引⽤类型之间转换重载标准的运算符以⽀持⾃定义类型给⾃定义类型添加类型强制转换运算符1.运算符算数运算符:+ - * / %逻辑运算符:& | ^ ~ && || !字符串连接运算符:+增量和减量运算符:++ --移位运算符:<< >>⽐较运算符:== != <> <= >=赋值运算符:= += -= *= /= %= &= |= ^= <<= >>=成员访问运算符:.索引运算符:[]类型转换运算符:()条件运算符(三元运算符):?:委托连接和删除运算符:+ -对象创建运算符:new类型信息运算符:sizeof is typeof as溢出异常控制运算符:checked unchecked间接寻址运算符:[]名称空间别名限定符:::空合并运算符:??其中:sizeof、*、->、&:只能⽤于不安全的代码2.checked和unchecked运算符把⼀个代码块标记为checked,CLR就会执⾏溢出检查,如果发⽣溢出,就抛出OverflowException异常。
如,byte b = 255;checked{b++;}Console.WriteLine(b.ToString());注意:⽤/checked编译器选项进⾏编译,就可以检查程序中所有未标记代码中的溢出。
相反,要禁⽌溢出检查,则⽤unchecked,不会抛出异常,但会丢失数据,溢出的位会别丢弃。
unchecked是默认⾏为,当需要在标记为checked的代码块中增加⼏⾏未检查的代码时才会使⽤。
3.is运算符可以检查对象是否与特定的类型兼容,“兼容”表⽰对象或者该类型,或者派⽣⾃该类型。
c++中equals用法

c++中equals用法在C++中,`equals`不是一个内置的函数或操作符。
然而,C++提供了其他用于比较对象相等性的方法。
下面是几种常见的方法:1. `==` 操作符:C++中的大部分数据类型(如基本数据类型、自定义类等)都支持`==`操作符,用于比较两个对象的相等性。
你可以通过重载`==`操作符来自定义对象的相等性比较规则。
例如,对于自定义类`Person`,你可以重载`==`操作符来比较两个`Person`对象的属性是否相等:```cppclass Person {public:std::string name;int age;bool operator==(const Person& other) const {return name == && age == other.age;}};// 使用示例Person p1{"John", 25};Person p2{"John", 25};if (p1 == p2) {// 两个对象相等}```2. `std::equal()` 函数:`std::equal()`函数是标准库中的一个算法,用于比较两个序列(数组、容器等)的元素是否相等。
你需要提供要比较的序列的起始和结束迭代器,以及要进行比较的另一个序列的起始迭代器。
以下是使用`std::equal()`函数比较两个数组是否相等的示例:```cpp#include <algorithm>#include <iostream>int main() {int arr1[] = {1, 2, 3, 4, 5};int arr2[] = {1, 2, 3, 4, 5};bool isEqual = std::equal(std::begin(arr1), std::end(arr1), std::begin(arr2));if (isEqual) {std::cout << "两个数组相等" << std::endl;} else {std::cout << "两个数组不相等" << std::endl;}return 0;}```3. 自定义比较函数:对于一些特殊的对象类型,你可能需要自定义比较函数来判断它们的相等性。
struct重载运算符

struct重载运算符C++中的struct可以像class一样定义成员函数和重载运算符。
下面介绍struct的运算符重载。
1.重载输出运算符。
重载输出运算符可以使得在输出struct对象时能够使用cout输出。
```cpp。
#include <iostream>。
using namespace std;。
struct Student 。
string name;。
int age;。
float score;。
friend ostream& operator<<(ostream &out, const Student &s) 。
out << "name: " << << ", age: " << s.age << ", score: " << s.score;。
return out;。
}。
};。
int main() 。
Student s = {"Tom", 18, 90};。
cout << s << endl; // 重载输出运算符,输出struct对象。
return 0;。
}。
```。
输出:```。
name: Tom, age: 18, score: 90。
```。
2.重载输入运算符。
重载输入运算符可以使得在输入struct对象时能够使用cin输入。
```cpp。
#include <iostream>。
using namespace std;。
struct Student 。
string name;。
int age;。
float score;。
friend istream& operator>>(istream &in, Student &s) 。
c++(8)-运算符重载(提高)-括号运算符重载

c++(8)-运算符重载(提⾼)-括号运算符重载1.括号运算符重载1.1 现象如果在调⽤时候遇到下⾯的写法,可能会出现两种情况,⼀种是函数的调⽤,⼀种是“()”括号运算符的重载;1.2 括号运算符重载【函数调⽤与运算符重载】2.为什么不要重载 && 和|| 操作符?【原因】1.&& 和|| 是 C++中⾮常特殊的操作符,&& 和|| 内置实现了短路规则;如果使⽤了c++的重载“&& 和|| ”⽆法使实现短路规则;1 #include <cstdlib>2 #include <iostream>3using namespace std;4class Test5 {6int i;78public:9 Test(int i)10 {11this->i = i;12 }13 Test operator+(const Test &obj)14 {15 Test ret(0);16 cout << " 执⾏ +号重载函数 " << endl;17 ret.i = i + obj.i;18return ret;19 }20bool operator&&(const Test &obj)21 {22 cout << " 执⾏ &&重载函数 " << endl;23return i && obj.i;24 }25 };26// && 从左向右27void main()28 {29int a1 = 0;30int a2 = 1;31 cout << "注意: &&操作符的结合顺序是从左向右 " << endl;32if (a1 && (a1 + a2))33 {34 cout << " 有⼀个是假,则不在执⾏下⼀个表达式的计算 " << endl;35 }36 Test t1 = 0;37 Test t2 = 1;38 If(t1 && (t1 + t2))39 {40//t1&& t1.operator(t2)41// t1.operator( t1.operator(t2) )42 cout << " 两个函数都被执⾏了,⽽且是先执⾏了 +" << endl;43 }44 system("pause");45return;46 }【说明】需要与“运算符的结合性”区别开;。
c++运算符重载加法和减法

c++运算符重载加法和减法在C++中,运算符重载允许我们重新定义现有的运算符,以便在用户自定义的数据类型上执行操作。
对于加法和减法运算符,我们可以通过重载来定义它们在自定义类上的行为。
首先,让我们来看一下如何重载加法运算符。
假设我们有一个名为`MyClass`的自定义类,我们希望能够使用`+`运算符来执行自定义的加法操作。
我们可以这样做:cpp.class MyClass {。
public:int value;MyClass(int v) : value(v) {}。
MyClass operator+(const MyClass& other) {。
MyClass result(0);result.value = this->value + other.value;return result;}。
};在这个例子中,我们重载了`+`运算符,使得当我们对两个`MyClass`对象进行相加时,会调用我们定义的`operator+`函数。
这个函数返回一个新的`MyClass`对象,其值为两个操作数的和。
接下来,让我们看一下如何重载减法运算符。
同样假设我们有一个名为`MyClass`的自定义类,我们希望能够使用`-`运算符来执行自定义的减法操作。
我们可以这样做:cpp.class MyClass {。
public:int value;MyClass(int v) : value(v) {}。
MyClass operator-(const MyClass& other) {。
MyClass result(0);result.value = this->value other.value;return result;}。
};在这个例子中,我们重载了`-`运算符,使得当我们对两个`MyClass`对象进行相减时,会调用我们定义的`operator-`函数。
这个函数返回一个新的`MyClass`对象,其值为两个操作数的差。
简述运算符重载的规则。

简述运算符重载的规则。
运算符重载是C语言中的一种语法特性,允许程序员在函数内部重载运算符,以改变其操作类型和参数类型。
运算符重载可以用于实现一些复杂的逻辑,也可以用于提高代码的灵活性和可重用性。
运算符重载的规则如下:
1. 运算符重载只能重载算术运算符和逻辑运算符,不能重载关系运算符(如+、-、*、/等)。
2. 运算符重载的重载点必须在函数内部,不能跨越函数调用。
3. 运算符重载的参数类型必须与运算符的类型相同或相似,且参数类型之间的运算符必须兼容。
4. 运算符重载的函数必须声明在头文件中,并且必须在文件定义之前声明。
5. 运算符重载的函数可以重载多个运算符,但是不能重复重载同一个运算符。
6. 运算符重载的函数可以修改原始运算符的行为,比如将一个算术运算符重载为逻辑运算符。
7. 运算符重载的函数可以改变运算符的顺序,比如将一个逻辑运算符重载为算术运算符。
8. 运算符重载的函数可以改变运算符的优先级,比如将一个逻辑运算符重载为算术运算符或者赋值运算符。
通过运算符重载,程序员可以实现一些复杂的逻辑,比如将一个算术运算符重载为逻辑运算符,以进行条件判断和流程控制。
运算符重载还可以提高代码的
灵活性和可重用性,因为不同的函数可以分别实现不同的逻辑,而不必共享相同的代码。
除了常见的算术运算符重载和逻辑运算符重载外,C语言还支持一些其他的运算符重载,比如字符串比较运算符重载、字符串拼接运算符重载等。
程序员可以根据具体的需求和场景,灵活地使用运算符重载来实现不同的逻辑。
漫谈C 重载运算符 - 飞鸽沟通最简单 - CSDN博客

漫谈C++重载运算符- 飞鸽沟通最简单- CSDN博客漫谈C++重载运算符收藏此文于2010-01-26被推荐到CSDN首页如何被推荐?1.前置运算符和后置运算符,左值和右值。
其实很久以来一直都没有怎么搞清楚左值和右值的区别,只知道左值可以放在等号的左边,也可以放在等号的右边,但是右值却只能放在等号的右边,然后形成一个大概直观的印象,知道怎么样做才不出错而已。
不过今天看看C++,却发现有了点新的体会。
对于表达式a--=5;这样一个表达式,明显是错误的,究其原因,是因为执行等号左边的自减表达式之后,显示取得a的值,然后才是进行自减操作,所以最终的结果是一个右值,而且就是a的值(变化前的),于是对于赋值语句b = a--,自然不会弄错了。
而对于--a=5;这样一个表达式,则明显就不同了。
首先执行的是自减操作,然后返回的是a的值(变化后的),于是自然就可以将返回的a值再次赋值了。
也就是说前置的运算符是左值表达式,而后置的则是右值表达式。
于是,我想到了很久前的一个想法:++a++ = 5;当然,行家肯定一看就知道是错误的,可是错误的地方需要改正啊。
于是我想到了几种方法,就是通过加括号的方法来实现。
1)++(a++) = 5; 其实通过错误信息就可以看到原因了:error: non-lvalue in increment ,明显说明在自增运算符中的那个表达式不是左值,所以不能自增运算了。
哦,对啊,a++是右值,于是的话再次进行++的操作就是错误的,因为++操作需要的表达式是左值表达式。
于是此处的方法行不通。
2)(++a)++ = 5;此处也不行,错误信息就是: error: non-lvalue in assignment,通过前面的表述就知道了,其实++a是左值表达式,那么后面的那个++操作就是一个错误了,赋值的时候,等号的左边不是左值表达式,因为括号外的是一个后置的++运算符。
于是,就得到了错误。
通过上面的这些折腾,对于++++a等等变态的表达式,相信也就有更深刻的体会了。
c# 运算符 重载

{
public static bool operator &(Coordinate op1, Coordinate op2) if ((op1.x != 0 && op1.y != 0) & (op2.x != 0 && op2.y != 0)) { return true; } else { return false; } }
Coordinate c7 = c1++; Coordinate c8 = c2--;
bool b1 = c7 > c8; bool b2 = c6 <= c2; // … } }
巨匠IT培训
using System; class Sample5_14 { public static void Main() { // … if (c4) Console.WriteLine("c4 至少有一个座标不为零。"); else Console.WriteLine("c4 所有座标都为零。"); if(!c5) Console.WriteLine("c5 所有座标都为零。"); else Console.WriteLine("c5 至少有一个座标不为零。"); if(c3 & c4) Console.WriteLine("c3 和 c4 两个座标都不为零。"); if(c7 | c0) Console.WriteLine("c7 和 c1 至少有一个座标不为零。"); } }
{
public static bool operator false(Coordinate op1) if (op1.x == 0 && op1.y == 0) { return true; } else { return false; } }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
c++ 重载比较运算符
在C++中,可以通过重载比较运算符来实现用户自定义类型的比较操作。
具体而言,可以通过重载“==”、“!=”、“<”、“>”、“<=”、“>=”等比较运算符,为自定义类型定义比较规则。
需要注意的是,C++规定,对于自定义类型,只能重载“<”运算符,而其他比较运算符都可以通过“<”和“==”运算符的组合实现。
具体而言,可以按照以下方式重载比较运算符:
1. 重载“<”运算符
定义一个成员函数或非成员函数,其返回值为bool类型,用于比较两个对象的大小关系。
重载“<”运算符的一般形式如下所示: bool operator<(const 类型& obj) const;
其中,类型代表自定义类型的名称,obj代表另一个需要进行比较的对象,const关键字表示该函数不会修改当前对象的状态。
2. 重载“==”运算符
如果需要重载“==”运算符,可以在重载“<”运算符的基础上,添加一条与“<”运算符相反的判断语句,从而实现“==”运算符的定义。
具体而言,重载“==”运算符的一般形式如下所示:
bool operator==(const 类型& obj) const;
其中,类型和obj的含义与重载“<”运算符中的相同。
3. 重载其他比较运算符
对于其他比较运算符,如“!=”、“>”、“<=”、“>=”等,可以通过重载“<”和“==”运算符的组合实现。
例如,重载“!=”运算符
的一般形式如下所示:
bool operator!=(const 类型& obj) const {
return !(*this == obj);
}
其中,类型和obj的含义与重载“<”运算符中的相同。
总之,C++中的比较运算符重载为自定义类型的比较操作提供了灵活的方式,通过重载比较运算符,可以根据自定义类型的特点,定义不同的比较规则,从而实现更加灵活和丰富的编程功能。