运算符重载和类型转换
c 运算符的重载习题答案
1.概念填空题1.1运算符重载是对已有的运算符赋予多重含义,使同一个运算符在作用于不同类型对象时导致不同的行为。
运算符重载的实质是函数重载,是类的多态性特征。
1.2可以定义一种特殊的类型转换函数,将类的对象转换成基本数据类型的数据。
但是这种类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。
类类型转换函数既没有参数,也不显式给出返回类型。
类类型函数中必须有return 表达式的语句返回函数值。
一个类可以定义多个类类型转换函数。
1.3运算符重载时其函数名由operator运算符构成。
成员函数重载双目运算符时,左操作数是对象,右操作数是函数参数。
2.简答题2.2简述运算符重载的规则。
2.2简述重载单目运算符++、--,前置和后置时的差别。
2.3 C++中重运算符是否都可以重载?是否都可以重载成类的成员函数?是否都可以重载成类的友元函数?2.4 构造函数作为类型转换函数的条件是什么。
3.选择题3.1在下列运算符中,不能重载的是(B)A.!B. sizeofC. newD. delete3.2 不能用友员函数重载的是(A)。
A.=B.==C.<=D.++3.3下列函数中,不能重载运算符的函数是(B)。
A.成员函数B.构造函数C.普通函数D.友员函数3.4如果表达式++i*k时中的”++”和”*”都是重载的友元运算符,则采用运算符函数调用格式,该表达式还可表示为(B)。
A.operator*(i.operator++(),k) B.operator*(operator++(i),k)C.i.operator++().operator*(k) D.k.operator*(operator++(i))3.5已知在一个类体中包含如下函数原型:VOLUME operator-(VOLUME)const;下列关于这个函数的叙述中,错误的是(B )。
A.这是运算符-的重载运算符函数B.这个函数所重载的运算符是一个一元运算符C.这是一个成员函数D.这个函数不改变数据成员的值3.6在表达式x+y*z中,+是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。
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运算符重载其实就是定义⼀个函数,在函数体内实现想要的功能,当⽤到该运算符时,编译器会⾃动调⽤这个函数,它本质上是函数重载。
运算符重载
// 顺序错误
.
27
由于使用友元会破坏类的封装,要尽量将运算 符重载函数定义为成员函数。
除非有特殊需要,才使用友元函数重载运算符。
.
28
4.5重载双目运算符
双目的意思是运算符左边和右边的操作数均参 加运算。
如果要重载 B 为类的成员函数,使之能够实 现表达式 oprd1 B oprd2,其中 oprd1 为A 类 对象,则 B 应被重载为 A 类的成员函数,形 参类型应该是 oprd2 所属的类型。
.
24
加法运算符重载为友元函数,C++ 在编译时将表达式 c1+c2解释为
operator + ( c1, c2) 即相当于执行以下函数
Complex operator + ( Complex & c1, Complex & c2 ) {
return Complex( c1.real + c2.real , c1.imag + c2.imag ) ; }
.
3
运算符重载的实质
运算符重载是对已有的运算符赋予多重含义。
必要性:C++中预定义的运算符其运算对象只 能是基本数据类型,而不适用于用户自定义类 型(如类)
实现机制
将指定的运算表达式转化为对运算符函数的调用, 运算对象转化为运算符函数的实参。
编译系统对重载运算符的选择,遵循函数重载的选 择原则。
friend Complex operator + ( int & i , Complex & c )
{
return Complex( c.real + i , c.imag ) ;
作业13
HZAU-专业C++作业13(运算符重载)判断题1. 所有的运算符都可以重载。
F2.在C++中,编译时的多态性是通过函数和运算符的重载实现的。
T3. 运算符重载是通过对已有的运算符重新定义操作功能来实现的,它是C++语言多态性的一种表现。
T4. 运算符重载只可以是类的成员函数和友元函数,不可以是普通函数。
T5. 运算符重载是通过函数来实现的,定义运算符重载函数时,函数名中要使用关键字operator。
T6. 运算符重载后,优先级、结合性和操作数都是不变的。
T7. 重载运算符的函数也可以设置默认参数。
F8. 使用成员函数方法和使用友元函数的方法所定义的重载运算符函数的参数个数是不相同的。
T9. 运算符“.”、“::” 、“?:” 不能重载T10. 运算符=、()、[]和->可作为类成员运算符, 不能作为友员运算符。
T选择题1.下列运算符中,(A )运算符在C++中不能重载。
A. ?:B. [ ]C. newD. &&2.下列运算符不能用友元函数重载的是(c)。
A. +B. =C. *D. <<3.在一个类中可以对一个操作符进行( D )重载。
A. 1种B. 2种及以下C. 3种及以下D. 多种4.友元运算符obj1>obj2被C++编译器解释为( A )。
A. operator > (obj1, obj2)B. > (obj1, obj2)C. obj2.operator > (obj1)D. obj1.operator > (obj2)5.下列关于C++运算符函数的返回类型的描述中,错误的是( C )。
A. 可以是类类型B. 可以是int类型C. 可以是void类型D. 可以是float类型6.下列关于运算符重载的描述中,正确的是( D )。
A. 运算符重载可以改变运算符的操作数的个数B. 运算符重载可以改变优先级C. 运算符重载可以改变结合性D. 运算符重载不可以改变语法结构7.先加一然后再使用的++运算符的重栽形式是(A)。
谭浩强《C++程序设计》课件 第10章
通过运算符重载,扩大了 通过运算符重载,扩大了C++已有运算符的作用范 已有运算符的作用范 使之能用于类对象. 围,使之能用于类对象. 运算符重载对C++有重要的意义,把运算符重载和 有重要的意义, 运算符重载对 有重要的意义 类结合起来,可以在C++程序中定义出很有实用意 类结合起来,可以在 程序中定义出很有实用意 义而使用方便的新的数据类型.运算符重载使C++ 义而使用方便的新的数据类型.运算符重载使 具有更强大的功能,更好的可扩充性和适应性, 具有更强大的功能,更好的可扩充性和适应性,这 最吸引人的特点之一. 是C++最吸引人的特点之一. 最吸引人的特点之一
c.imag=imag+c2.imag; return c;} void Complex∷display( ) //定义输出函数 ∷ 定义输出函数 {cout<<〃(〃<<real<<〃,〃<<imag<<〃i)〃<<endl;} int main( ) {Complex c1(3,4),c2(5,-10),c3; c3=plex_add(c2); cout<<〃c1=〃; c1.display( ); cout<<〃c2=〃; c2.display( ); cout<<〃c1+c2=〃; c3.display( ); return 0; }
Complex operator+ (Complex& c1,Complex& c2);
在定义了重载运算符的函数后,可以说: 在定义了重载运算符的函数后,可以说: 函数 operator+重载了运算符 . 重载了运算符+. 重载了运算符 为了说明在运算符重载后,执行表达式就是调用函 为了说明在运算符重载后, 数的过程, 数的过程,可以把两个整数相加也想像为调用下面 的函数: 的函数:
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++编写运算符重载,实现对十六进制数进行加减乘除操作,并且可以在不同进制间进行转换。
我们将对C++中的运算符重载、进制转换等知识进行详细讲解,让读者能够更深入地了解C++编程语言。
首先,我们将介绍如何对十六进制数进行加减乘除运算。
在
C++中,运算符重载可以让我们自定义运算符的行为。
我们可以使用运算符重载来实现对十六进制数的加减乘除运算。
在编写运算符重载时,我们需要定义运算符的行为,例如加法运算符的行为应该是将两个十六进制数相加,并返回结果。
其次,我们将介绍如何进行进制转换。
在实际的开发中,我们经常需要将不同进制的数字进行转换。
例如,我们可能需要将一个十六进制数转换成二进制或者十进制。
在C++中,我们可以使用一些函数来实现进制转换,例如hex、oct、dec函数。
这些函数分别可以将一个十六进制数、八进制数、十进制数转换成其他进制的数字。
最后,我们将把上述知识点合并起来,编写一个可以进行十六进制数的加减乘除运算,并且可以在不同进制之间进行转换的程序。
通过这个程序,读者可以更加深入地了解C++语言中的运算符重载、进制转换等知识点。
- 1 -。
c语言 重载 赋值运算符
c语言重载赋值运算符C语言作为一门高级编程语言,提供了丰富的功能以满足各种编程需求。
其中,运算符重载就是一项非常重要的特性。
运算符重载可以让程序员自定义已有运算符在新类型上的操作方式,使得语言更加灵活和强大。
本文将详细介绍C语言中赋值运算符的重载,包括重载的原理、步骤、方法以及注意事项。
1.C语言中的重载概念C语言中的运算符重载是指在已有的运算符上,根据运算对象的类型,赋予新的操作含义。
这种重载是基于类型的,不同类型之间的运算符重载有不同的处理方式。
运算符重载可以让原有运算符在特定类型上具有更符合语义的操作方式,例如对赋值运算符的重载可以让赋值操作更加直观。
2.赋值运算符的重载原理在C语言中,赋值运算符"="原本用于将右侧的值赋给左侧的变量。
当我们对赋值运算符进行重载时,实际上是将原有赋值操作转换为一个新的表达式,这个表达式中包含了重载后的赋值操作。
重载后的赋值运算符需要满足以下条件:- 重载后的赋值运算符仍为一个二元运算符。
- 重载后的赋值运算符的优先级和结合性与其他运算符保持一致。
- 重载后的赋值运算符需要考虑运算对象的类型,以实现正确的赋值操作。
3.重载赋值运算符的步骤与方法重载赋值运算符的步骤如下:- 定义一个函数,该函数的参数列表中包含一个或多个变量引用。
- 在函数体中,对传入的变量进行操作,以实现重载后的赋值操作。
- 使用函数返回值替换原赋值表达式中的右侧值。
以下是一个重载赋值运算符的示例:```c#include <iostream>class MyClass {public:void operator=(const MyClass& other) {// 实现重载后的赋值操作std::cout << "重载赋值运算符被调用" << std::endl;}};int main() {MyClass obj1;MyClass obj2;obj1 = obj2; // 调用重载后的赋值运算符return 0;}```4.重载赋值运算符的注意事项- 重载赋值运算符时,需要确保运算对象具有可赋值性。
4第四章 运算符重载
const complex operator - (const complex &c) const; void display(); //输出复数 private: //私有数据成员 1.是为了堵塞a+b=c的漏洞。 double real; //复数实部 2. 3.是为了扩大适应性。 double imag; //复数虚部 };
17
[ ]运算符重载为成员函数
下标运算符[]可以重载: 重载形式为:operator[](int); 当 X x; 隐含调用。 x[y] 可被解释为: 显式调用。 x. operator [ ](y); 只能重载为成员函数,不能使用友元函数。 这个类显然是个‚数组类‛。
18
前置++和后置++重载为成员函数
9
使用
void main(){
complex c1(5,4),c2(2,10),c3; //三个复数类的对象 cout<<"c1="; cout<<"c2="; c1.display(); c2.display();
c3=c1-c2; //使用重载运算符完成复数减法 cout<<"c3=c1-c2="; c3.display(); 程序输出结果为:
这三个运算符是许多 教课书没有提到的。
唯一的一个三目运 算符不能重载。
3
运算符重载的基础
设计运算符重载函数,首先要了解运算符原本的运算语义。重
载函数要忠实遵守该运算符作用于基本数据类型时的语义,
并表现出自身所特有的性质。 例如:+ 、+= 、=、++(前)、++(后) ....
07运算符重载
运算符重载运算符重载 (1)0.运算符重载一般概念 (2)1.运算符重载规则 (2)1.1. 允许重载的运算符 (2)1.2. 不允许重载的运算符 (2)1.3. 其他规则 (3)2.运算符重载普通函数、友员函数和类成员函数 (3)3.单目预算符、双目运算符重载 (4)4.转换构造函数和类型转换运算符 (4)5.赋值运算符的重载 (5)6. []下标运算符重载 (6)7. new和delete重载 (6)8.指针运算符->的重载 (7)运算符重载一般概念C++内部定义的数据类型(int , float, …)的数据操作可以用运算符号来表示,其使用形式是表达式,用户自定义的类型的数据的操作则用函数表示,其使用形式是函数调用。
为了是对用户自定义数据类型的数据的操作与内定义的数据类型的数据的操作形式一致,C++提供了运算符的重载,通过把C++中预定义大的运算符重载为类的成员函数或者友员函数,使得对用户的自定义数据类型的数据—对象的操作形式与C++内部定义的类型的数据一致。
重载即赋予新的含义。
运算符重载指对已知的运算符,在新的场合,通过程序实现新的行为。
什么时候重载需要对象间相互赋值时,重载赋值运算符需要数字类型算术运算时,重载算术运算符需要进行逻辑比较时,重载关系运算符对于容器,重载下标运算符[]需要输入输出时,重载<<和>>运算符重载成员指针运算符-> 以实现smart指针在少数情况下重载new,delete运算符不重载其他运算符0.运算符重载规则0.1.允许重载的运算符表 1.1 允许重载的运算符0.2.不允许重载的运算符不允许重载的运算符只有5个:. (成员访问符).* (成员指针访问运算符):: (域运算符)sizeof (长度运算符)?: (条件运算符号)0.3.其他规则不允许自己定义新的运算符,只能对已有的运算符号进行重载;重载不能改变运算符运算对象的个数,如>和<是双目运算符,重载后仍为双目运算符,需要两个参数;重载不能改变运算符的结合性,如=是从右至左,重载后仍然为从右至左;重载不能改变运算符的优先级别,例如* / 优先于+-,那么重载后也是同样的优先级别;重载运算符的函数不能有默认的参数,否则就改变了运算符参数的个数,与第2条矛盾;重载的运算符必须和用户的自定义数据类型一起使用,其参数至少应有一个是类对象(或者类对象的引用),或者说参数不能全部是C++的标准类型;运算符重载函数可以是类的成员函数,也可以是类的友员函数,也可以使普通函数。
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) 。
第八讲 运算符重载
8.2
算术运算符、 算术运算符、赋值运算符和逻辑运算符的重载
8.2.1 重载算术运算符
class Complex { //…… public: Complex operator+(double) { //…… } //…… }; Complex a, b; a=b+10.0; a=10.0+b; b.operator(10.0) 10.0.operator(b)
#include <iostream.h> class HowMany{ public: HowMany() {cout<<"Constructor"<<endl;} ~HowMany() {cout<<"Disconstructor"<<endl;} HowMany(const HowMany& ) {cout<<"Copy Constructor"<<endl;} void print(){cout<<"Member function"<<endl;} }; HowMany f(HowMany x) { x.print(); return x; } void main(){ HowMany h; HowMany h1=f(h); h1.print(); HowMany h2; h2=f(h); }
赋值运算符一般 用预定义的
单目运算符重载: 单目运算符重载:
Complex Complex:: operator-() { Complex temp; temp.rpart=-rpart; temp.ipart=-ipart; return temp; }
《C++程序设计》电子教案第7章 运算符重载
7.1 7.2 7.3 7.4 7.5 运算符重载概述 运算符重载的实现 一元运算符重载 二元运算符重载 特殊运算符重载
7.1 运算符重载概述
运算符重载是对已有的运算符赋予多重含义, 运算符重载是对已有的运算符赋予多重含义, 同一个运算符作用于不同类型的数据导致不同 类型的行为。 类型的行为。 运算符重载的实质就是函数重载。 运算符重载的实质就是函数重载。在实现过程 中,首先把指定的运算表达式转化为对运算符 函数的调用, 函数的调用,运算对象转化为运算符函数的实 参,然后根据实参的类型来确定需要调用的函 这个过程是在编译过程中完成的。 数,这个过程是在编译过程中完成的。
返回首页
算符有前缀和后缀两 如同 “ ++ ” 运 算符有前缀和 后缀两 种 使用形式 一样 , 运算符有前缀和后缀两 种使用形式 “++”和“--”重载运算符也有前缀和后缀两种运算符 ” ” 重载形式, 重载形式 , 以 “ ++” 重载运算符为例 , 其语法格式如 ” 重载运算符为例, 下: <函数类型 operator ++(); 函数类型> ( //前缀运算 前缀运算 函数类型 <函数类型 operator ++(int); //后缀运算 函数类型> 函数类型 ( ) 后缀运算 使用前缀运算符的语法格式如下: 使用前缀运算符的语法格式如下: ++<对象 对象>; 对象 使用后缀运算符的语法格式如下: 使用后缀运算符的语法格式如下: <对象 对象>++; 对象
static char* str; String String::operator+(const String& a) { strcpy(str,name); strcat(str,); return String(str); } void main() { str=new char[256]; String demo1("Visual c++"); String demo2("6.0"); demo1.display(); demo2.display();
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++学习之路—运算符重载(二)运算符重载作为类的成员函数和友元函数
C++学习之路—运算符重载(⼆)运算符重载作为类的成员函数和友元函数对运算符重载的函数有两种处理⽅式:(1)把运算符重载的函数作为类的成员函数;(2)运算符重载的函数不是类的成员函数,在类中把它声明为友元函数。
1 把运算符重载函数作为类的成员函数例1:为了便于说明问题,将重载函数的定义重写如下:1: Complex Complex :: operator + ( Complex& c2 )2: {3: Complex c ;4: c.real = real + c2.real ;5: c.imag = imag + c2.imag ;6:return c ;7: }有⼈可能会提出这样的疑问:“+”是双⽬运算符,为什么重载函数只有⼀个参数呢?实际上,运算符重载函数应当有两个参数,但是,由于重载函数是Complex类中的成员函数,因此有⼀个参数是隐含的,运算符函数是⽤this指针隐式的访问类对象的成员。
可以看到operator+访问了两个对象中的成员,⼀个是this指针指向的对象中的成员,⼀个是形参对象中的成员。
2 把运算符重载函数作为类的友元函数运算符重载函数除了可以作为类的成员函数外,还可以是⾮成员函数。
在有关的类中把它声明为友元函数,即友元运算符重载函数。
例2:将运算符+重载为适⽤于复数加法,重载函数不作为成员函数,⽽放在类外,作为Complex类的友元函数。
1:class Complex2: {3:public:4: ...5:friend Complex operator + ( Complex& c1 , Complex& c2 ) ; //重载函数作为友元函数6:private:7:double real ;8:double imag ;9: };10:11: Complex operator + ( Complex& c1 , Complex& c2 ) //定义运算符+重载函数12: {13: Complex c ;14: c.real = c1.real + c2.real ;15: c.imag = c1.imag + c2.imag ;16:return c ;17: }这个程序和把运算符重载函数作为类的成员函数相⽐,只做了⼀处改动,就是将运算符重载函数作为类外的普通函数,并在Complex类中声明它为友元函数。
c++中的运算规则
c++中的运算规则C++是一种高级编程语言,具有丰富的运算规则。
以下是C++的运算规则的详细解释,包括算术运算、逻辑运算、位运算和赋值运算等。
1.算术运算规则C++中的算术运算符包括加法(+)、减法(-)、乘法(*)、除法(/)和取模(%)等。
算术运算符遵循常见的数学规则,如加法和乘法的交换律和结合律。
例如,a + b + c等同于c + b + a,a * b* c等同于c * b * a。
2.逻辑运算规则C++中的逻辑运算符包括与(&&)、或(||)和非(!)等。
逻辑运算符用于在条件语句中组合多个条件。
逻辑运算符具有短路求值的特性,即如果逻辑表达式的结果可以在求值过程中确定,则不会继续求值。
例如,对于表达式(a && b && c),如果a为false,那么b和c将不会被评估。
3.位运算规则C++中的位运算符包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)和移位运算符(<<和>>)等。
位运算用于对二进制位进行操作。
按位与和按位或运算符遵循相应的逻辑规则。
按位异或运算符执行“不同为1,相同为0”的操作。
按位取反运算符将二进制位取反。
移位运算符用于将二进制位向左或向右移动指定的位置数。
例如,x << n表示将变量x的二进制位向左移动n位。
4.赋值运算规则C++中的赋值运算符(=)用于将一个值赋给变量。
赋值运算符允许简化代码,将右操作数的值赋给左操作数。
例如,x = y将y的值赋给x。
除了上述常见的运算规则,C++还有其他一些特殊的运算规则,如自增(++)和自减(--)运算符。
自增运算符将变量的值增加1,而自减运算符将变量的值减少1。
此外,C++还支持强制类型转换。
使用强制类型转换运算符,可以将一个类型的值转换为另一种类型。
例如,int x =static_cast<int>(3.14)将3.14转换为整数类型。
c++编写运算符重载十六进制加减乘除转换
c++编写运算符重载十六进制加减乘除转换在C++中,运算符重载允许开发人员重新定义运算符的行为。
我们可以使用运算符重载来实现十六进制数的加减乘除,并且还可以将十六进制数转换为其他数制。
下面是具体的实现方法:1. 实现十六进制数的加减乘除我们可以通过运算符重载来实现十六进制数的加减乘除。
比如,我们可以定义一个名为“Hex”的类来表示十六进制数,然后重载“+”、“-”、“*”和“/”运算符来实现对十六进制数的加减乘除。
具体实现可以参考下面的代码:class Hex {public:Hex(string strHex) {// 将十六进制数转换为十进制数并存储在m_nValue中m_nValue = hexToDec(strHex);}Hex operator+(const Hex& hex) const {// 将两个十六进制数的十进制值相加并返回一个新的Hex对象 return Hex(decToHex(m_nValue + hex.m_nValue));}Hex operator-(const Hex& hex) const {// 将两个十六进制数的十进制值相减并返回一个新的Hex对象 return Hex(decToHex(m_nValue - hex.m_nValue));}Hex operator*(const Hex& hex) const {// 将两个十六进制数的十进制值相乘并返回一个新的Hex对象 return Hex(decToHex(m_nValue * hex.m_nValue));}Hex operator/(const Hex& hex) const {// 将两个十六进制数的十进制值相除并返回一个新的Hex对象 return Hex(decToHex(m_nValue / hex.m_nValue));}private:int m_nValue;int hexToDec(string strHex) {// 将十六进制数转换为十进制数int nDec = 0;for (int i = 0; i < strHex.length(); i++) {nDec = nDec * 16 + hexCharToDec(strHex[i]);}return nDec;}string decToHex(int nDec) {// 将十进制数转换为十六进制数stringstream ssHex;ssHex << hex << uppercase << nDec;return ssHex.str();}int hexCharToDec(char cHex) {// 将十六进制字符转换为十进制数if (cHex >= '0' && cHex <= '9') {return cHex - '0';} else if (cHex >= 'A' && cHex <= 'F') {return cHex - 'A' + 10;} else if (cHex >= 'a' && cHex <= 'f') {return cHex - 'a' + 10;}return 0;}};使用上述代码,我们就可以轻松地进行十六进制数的加减乘除操作了。
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.运算符重载定义:C++中预定义的运算符的操作对象只能是基本数据类型。
但实际上,对于许多⽤户⾃定义类型(例如类),也需要类似的运算操作。
这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够⽤于特定类型执⾏特定的操作。
运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引⼈的特性之⼀。
运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进⾏的操作。
运算符函数的定义与其他函数的定义类似,惟⼀的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。
运算符函数定义的⼀般格式如下:<返回类型说明符> operator <运算符符号>(<参数表>){<函数体>} 2.运算符重载时要遵循以下规则:(1) 除了类属关系运算符"."、成员指针运算符".*"、作⽤域运算符"::"、sizeof运算符和三⽬运算符"?:"以外,C++中的所有运算符都可以重载。
(2) 重载运算符限制在C++语⾔中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。
(3) 运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。
(4) 重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。
(5) 运算符重载不能改变该运算符⽤于内部类型对象的含义。
它只能和⽤户⾃定义类型的对象⼀起使⽤,或者⽤于⽤户⾃定义类型的对象和内部类型的对象混合使⽤时。
(6) 运算符重载是针对新类型数据的实际需要对原有运算符进⾏的适当的改造,重载的功能应当与原有功能相类似,避免没有⽬的地使⽤重载运算符。
(7)重载运算符的函数不能有默认的参数,否则就改变了运算符的参数个数,与前⾯第3点相⽭盾了;(8)重载的运算符只能是⽤户⾃定义类型,否则就不是重载⽽是改变了现有的C++标准数据类型的运算符的规则了,会引会天下⼤乱的;(9)⽤户⾃定义类的运算符⼀般都必须重载后⽅可使⽤,但两个例外,运算符“=”和“&”不必⽤户重载;(10)运算符重载可以通过成员函数的形式,也可是通过友元函数,⾮成员⾮友元的普通函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
运算符重载的目的 运算符重载概述 重载的规则和限制 如何重载运算符 常见运算符的重载 类型转换 小结
class Complex { public: Complex(float r=0, float i=0) { real=r; image=i;} Complex add(const Compex &c) { return Complex(real + c.real, image+c.image);} private: float real, image; };
>>=
Байду номын сангаас
<<=”,
若运算符所需的操作数(尤其是第一个操作数)希望有隐式类型转换,则 只能选用友元函数。 当需要重载运算符的运算具有可交换性时,选择重载为友元函数。 >> << 作为提取和插入运算符使用时,只能用友元函数重载
void main() { int i = 29, j = 870, k; float x = 2.6, y = 2.4; k = i + j; float z = x + y; Complex c1(3.2,4.6), c2(6.2,8.7), c3; c3 = c1.add(c2); }
运算符重载概述
重载为类的友元函数
此时运算所需的操作数都是通过函数的参数表来传递,在参数表中形 参从左到右的顺序就是运算符操作数的顺序。 双目运算符 B重载后, (ch18_2) 表达式oprd1 B oprd2 等同于operator B(oprd1,oprd2 ) 前置单目运算符 B重载后, B oprd 等同于 operator B(oprd ) 后置单目运算符 ++和- -重载后,此时函数的形参有两个,一个是类 的对象,另一个是整型(int)形参 oprd B 等同于 operator B(oprd,0 )
重载为类的成员函数
双目运算符 B 如果要重载 B 为类的成员函数,使之能够实现表达式 oprd1 B oprd2,其中 oprd1 为A 类对象,则 B 应被重载为 A 类的 成员函数,形参类型应该是 oprd2 所属的类型。 经重载后, oprd1 B oprd2 相当于 oprd1.operator B(oprd2) 前置单目运算符 U 如果要重载 U 为类成员函数,使之能够实现表达式 U oprd, 其中 oprd 为A类对象,则 U 应被重载为 A 类的成员函数, 无形参。经重载后,表达式 U oprd 相当于 oprd.operator U()
运算符是一些系统预定义的函数名称,即用一些特定的符号 表示各种运算。每个运算符对运算数据都有一定要求。 C++中预定义的运算符的操作对象只能是基本数据类型,实 际上,对于很多用户自定义类型,也需要有类似的运算操作, 这就提出了对运算符进行重新定义,赋予已有符号以新功能 的要求。
运算符重载是对已有的运算符赋予多重含义,同一个运算符 作用于不同类型的数据导致不同类型的行为。
运算符函数
定义运算符重载函数的一般格式: <type> operator @(<arg>) { ...... //函数体 } type为函数返回值的类型;@为要重载的运算符;arg为函数的形参表,
operator是关键字,它与其后的运算符一起构成函数名。 为了提高访问效率,运算符重载函数通常需要直接访问对象的私有或保护的 数据成员,因此运算符重载函数通常为类的成员函数或者友元函数。
后置运算符“++” 和“ ” 如果要实现表达式oprd++或oprd ,其中oprd为A 类 对象,那么运算符重载函数中要带一个整型(int)形参。 经 重载后, oprd++ 相当于 oprd.operator ++(0) oprd 相当于 oprd.operator (0) 前增量与后增量的区别 使用前增量时,对对象(操作数)进行增量修改,然后 再返回该对象,参数与返回的是同一个对象 使用后增量时,必须在增量之前返回原有的对象。后增 量操作返回的是原有对象值,不是原有对象,原有对象已 经被增量修改。
习惯形式 a+b -a a++
友元调用形式 operator+(a,b) operator-(a) operator++(a,0)
成员调用形式 a. operator+(b) a. operator-( ) a. operator+(0)
成员与友元运算符函数选取经验
对于单目运算符,建议选择成员函数。 对于运算符“= ()[ ] -> ”只能作为成员函数。 对于运算符“ += -= /= *= &= != ~= %= 建议重载为成员函数。 对于其他运算符,建议重载为友元函数。 类型转换函数只能定义为一个类的成员函数。
运算符重载的实质就是函数重载。在实现过程中,首先把指 定的运算表达式转化为对运算符函数的调用,运算对象转化 为运算符函数的实参,然后根据实参的类型来确定需要调用 的函数,这个过程是在编译过程中完成的。
运算符重载的规则和限制
不可以重载的运算符有:. .* :: ?: sizeof 只能重载C++语言中已有的运算符,不可臆造新的。 运算符重载后优先级和结合性都不会改变, 不能改变操作数个数,单目只能重载为单目运算符,双目只能重载为双目运算 符 不能改变运算符对预定义类型数据的操作方式,即重载运算符时,其操作数 中至少应该有一个是自定义类型。 重载的运算符应保持其原有的基本语义。 C++ 规定:= -> ( ) [ ] 只能重载为成员函数形式: >> << 作为提取和插入运算符使用时,只能用友元函数重载
两种重载形式的比较
对双目运算符而言,成员运算符函数带有一个参数,而友元运算符函 数带有两个参数;对单目运算符而言,成员运算符函数不带参数,而 友元运算符函数带有一个参数 。 双目运算符一般可以被重载为友元运算符函数或成员运算符函数,但 有一种情况必须使用友元函数,如加法运算。 运算符函数调用形式