重载函数

MSDN上的重载运算符操作

大憨熊 提交于 2020-02-23 16:00:40
再读MSDN的重载运算符 MSDN 就是微软开发的官方指南了,里面都是对开发中应用到的基本知识作很精辟的讲解,这一篇读读可重载的运算符。 C# 允许用户定义的类型通过使用 operator 关键字定义静态成员函数来重载运算符。但不是所有的运算符都可被重载,下表列出了不能被重载的运算符: 运算符 可重载性 + 、 - 、 ! 、 ~ 、 ++ 、 -- 、 true 和 false 可以重载这些一元运算符。 + , - , * , / , % , & , | , ^ , << , >> 可以重载这些二进制运算符。 == , != , < , > , <= , >= 比较运算符可以重载(但请参见本表后面的说明)。 && , || 条件逻辑运算符不能重载,但可使用能够重载的 & 和 | 进行计算。 [] 不能重载数组索引运算符,但可定义索引器。 () 不能重载转换运算符,但可定义新的转换运算符(请参见 explicit 和 implicit )。 += , -= , *= , /= , %= , &= , |= , ^= , <<= , >>= 赋值运算符不能重载,但 += 可使用 + 计算,等等。 = 、 . 、 ?: 、 -> 、 new 、 is 、 sizeof 和 typeof 不能重载这些运算符。 注意 比较运算符(如果重载)必须成对重载;也就是说,如果重载 ==,也必须重载

C++学习笔记13——模板篇

别说谁变了你拦得住时间么 提交于 2020-02-22 23:38:56
教程:https://www.imooc.com/learn/477 运算符重载:给原有运算符赋予新功能 上图,用+连接多个字符串使其拼接成一个字符串str3,打印的时候可以直接把这个字符串打印出来,则这个字符串进行了多个运算符的重载,+也进行了重载,cout也进行了重载,=也进行了重载 上图,原来+并不具备这样子把两个坐标相加的功能,需要对其进行重载,要这样子把坐标输出,也要对输出运算符进行重载 运算符重载的本质:函数重载 关键字:operator 一元运算符重载(这里以-、++举例) 一元运算符:这个符号只与一个操作数进行运算 如:+(加法)是二元运算符,因为需要两个操作数,但把+放在一个操作数前面,就是一元运算符,就像-放在一个操作数前面,也是一元运算符,对操作数取反 友元函数重载:在类中定义一个友元函数,这个友元函数是一个全局函数,用这个友元函数进行运算符重载,从而实现一个符号的理想功能 成员函数重载:实际上就是定义一个成员函数 上图标红句子是对-进行运算符重载,()里没有参数是因为是一元运算符,而且是作为类的成员函数存在的,所以不需要传任何参数,但里面是有一个隐性的this指针的,而这个隐性的this指针就是其操作数,如下图,将每个数据成员取反,再重新赋值给他本身: 使用: 看到 -coor1; 计算机会自动解释为注释,相当于一个函数的调用 友元函数的重载

操作符重载(下)

浪子不回头ぞ 提交于 2020-02-22 00:55:17
文章目录 类的成员函数是否可以作为操作符重载的函数? 用成员函数重载的操作符 什么时候使用全局函数重载操作符?什么时候使用成员函数重载操作符? 重载=, []操作符有什么用哪? 重载[]操作符 重载=操作符 重载=操作符 数组类:最终完整代码 C++编译器会为每个类提供默认的赋值操作符= ++操作符重载 不要重载&&和||,为什么? 小结 类的成员函数是否可以作为操作符重载的函数? 通过operator关键字能够将操作符定义为全局函数 操作符重载的本质就是函数重载 类的成员函数是否可以作为操作符重载的函数? A:当然可以 #include <cstdlib> #include <iostream> using namespace std; class Complex { int a; int b; public: Complex(int a, int b) { this->a = a; this->b = b; } Complex operator+ (const Complex& c2); //成员函数:+操作符重载 //注意:此处有一个隐藏参数:this指针 friend ostream& operator<< (ostream& out, const Complex& c); }; ostream& operator<< (ostream& out, const

[C++]STL-函数对象基础知识

故事扮演 提交于 2020-02-21 18:59:00
函数对象(仿函数) 重载函数调用操作符的类,其对象称为函数对象(function object),即他们是行为类似函数的对象,也叫仿函数(functor),其实就是重载"()"操作符,使得类对象可以像函数那样被调用 注意: 函数对象(仿函数)是一个类,不是一个函数 假定某个类有一个重载的operator(),而且重载的operator()要求获取一个参数,就称其为“一元仿函数(unary functor)”;诸如此类,两个参数即称为二元仿函数等等 # include <iostream> # include <vector> # include <algorithm> using namespace std ; struct MyPrint { MyPrint ( ) : num ( 0 ) { } void operator ( ) ( int val ) { num ++ ; //记录函数调用次数 cout << val << endl ; } int num ; } ; void FunctorTest1 ( ) { MyPrint print ; print ( 45 ) ; //函数对象可以像普通函数那样调用 //函数对象也可以像普通函数那样接入参数 //函数对象超出了函数的概念,函数对象可以保存函数调用的状态 } int num = 0 ; //真正开发中

C++ 内存分配(new,operator new)详解

做~自己de王妃 提交于 2020-02-20 04:12:10
参考: C++ 内存分配(new,operator new)详解 如何限制对象只能建立在堆上或者栈上 new运算符和operator new() new:指我们在C++里通常用到的 运算符 ,比如A* a = new A; 对于new来说,有new和::new之分,前者位于std operator new():指对new的重载形式,它是一个 函数 ,并不是运算符。对于operator new来说, 分为全局重载和类重载 ,全局重载是void* ::operator new(size_t size),在类中重载形式 void* A::operator new(size_t size)。还要注意的是这里的operator new()完成的操作一般只是分配内存,事实上系统 默认的全局 ::operator new(size_t size)也只是调用malloc分配内存,并且返回一个void*指针 。而构造函数的调用(如果需要)是在new运算符中完成的 new和operator new之间的关系 A* a = new A;我们知道这里分为两步: 1.分配内存,2.调用A()构造对象。 事实上,分配内存这一操作就是由operator new(size_t)来完成的,如果类A重载了operator new,那么将调用A::operator new(size_t ),如果没有重载,就调用:

C++笔记(六):C++重载操作符

我们两清 提交于 2020-02-20 02:17:31
重载操作符 在C++中,我们可以重载函数,也可以重载操作符;在C++中大部分的操作符是可以重载的,只有6个不可以; 可以重载的操作符有42个: 不可以重载的操作符有6个: . :成员访问运算符 .* , ->* :成员指针访问运算符 :: :域运算符 sizeof :长度运算符 ?: :条件运算符 #: 预处理符号 重载操作符的注意事项: 有四个操作符必须定义为类成员函数: = 、 [] 、 () 、 -> 。 在声明操作符成员函数时,若该操作符是一个二元函数,则只能声明成友元函数。 一般没有特殊规定,重载函数根据习惯定义。 例: 先定义一个类为: class Rect{ public: void ShowL() const; size_t GetLVal(); void SetLVal(size_t L); void ShowW() const; size_t GetWVal(); void SetWVal(size_t W); Rect(); Rect(size_t W,size_t L); Rect(const Rect& str); ~Rect(); private: size_t L,W; }; 重载输入输出操作符 //重载声明 friend ostream& operator<<(ostream& out,Rect& rc); friend istream&

C++之函数重载

空扰寡人 提交于 2020-02-19 11:44:43
C++允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。 例: 1). 形参类型不同 int add ( int x , int y ) float add ( float x , float y ) 2). 形参个数不同 int add ( int x , int y ) int add ( int x , int y, int z ) 注意事项 重载函数的形参必须不同:个数不同或类型不同。 编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。 错误示例: int add ( int x , int y ) ; int add ( int a , int b ) ; 原因: 编译器不以形参名来区分 错误示例: int add ( int x , int y ) ; void add ( int x , int y ) ; 原因: 编译器不以返回值来区分 不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。这样不好: int add ( int x , int y ) : float add ( float x , float y ) : return x + y ; return x - y ; 来源: CSDN 作者: 北木. 链接: https://blog.csdn.net/weixin_43283397

函数重载与函数模板

自闭症网瘾萝莉.ら 提交于 2020-02-17 22:43:43
一、函数重载 重载就是函数名相同但实参的类型或数量不同的函数的调用。 注意有两种:实参是类型不同或数量不同。(为什么不说形参,因为会有默认值的存在) 如得到一数组中最大值,因为有int和double基本的类型,一个函数无法表达 int getmax(int intArr[],int len);double getmax(double douArr[],int len); 为什么要同名?   主要是方便记忆。如你输入getmax后,编译器会自动给你提示有这样的函数且会把它的形参类型带出来,便于选择。当然你也可以写成不同的名称: getintmax,getdoublemax. 多个在一程序中的同名函数就是函数重载,以下为得到数组的最大值例子: #include<iostream>using namespace std;int getmax(int intArr[],int len);double getmax(double douArr[],int len);int main(){ int arr1[]={25,1,86,45,365,55,8}; int len1=sizeof arr1 / sizeof(int); double arr2[]={253.55,12.2,8895.12,4.9}; int len2=sizeof arr2 / sizeof(double); cout

09-函数重载分析(下)

蹲街弑〆低调 提交于 2020-02-15 23:53:13
注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。 测试环境:Ubuntu 10.10 GCC版本:4.4.5 一、重载与指针 1)下面的函数指针将保存在哪个函数的地址? 2) 函数重载 遇上 函数指针 - 将 重载函数名 赋值给 函数指针 时 1.根据重载规则挑选与 函数指针参数列表一致 的候选者 2. 严格匹配 候选者的函数类型与函数指针的 函数类型 编程实验 函数重载VS函数指针 9-1.cpp /* 这个例子是为了证明: - 重载函数名赋值给指针时 1.根据重载规则挑选与函数指针参数列表一致的候选者 2.严格匹配候选者的函数类型与函数指针的函数类型 */ #include <stdio.h> #include <string.h> int func(int x) { return x; } int func(int a, int b) //不满足条件1 { return a + b; } int func(const char* s) //不满足条件2 { return strlen(s); } typedef int(*PFUNC)(int a); //typedef void(*PFUNC)(int a); //函数类型与定义的函数不相同 int main(int argc, char *argv[]) { int c = 0; PFUNC p = func

C++操作符重载之下标操作符 ([], [][])

拜拜、爱过 提交于 2020-02-15 05:21:28
自定义类型 MyClass 中如果含有STL顺序容器成员 sequential_container<type> ,可能希望定义 MyClass ::operator [] 操作符;如果STL顺序容器是多维的 sequential_constainer<sequential_constainer<...<type>...> ,可能希望定义 MyClass 的 [][]... 操作符。 [] 重载[]操作符: 1. 双目操作符,第一操作数是重载此操作符的对象,第二操作数是无符号下标。 2. C++不允许把下标操作符函数作为外部函数来定义,它只能是非静态的成员函数。 3. 为了能对数组赋值,一般将返回值声明为引用类型。 ReTurnType& MyClass::operator[](unsigned int idx); 例一: 1 #include <iostream> 2 #include <iomanip> 3 #include <fstream> 4 #include <string> 5 #include <vector> 6 7 using namespace std; 8 9 class Data1d{ 10 11 vector<double> data1d; 12 int length1d; 13 14 public: 15 Data1d(int lg=0, double