重载函数

C++操作符重载

允我心安 提交于 2020-02-15 05:20:35
操作符重载本质上函数重载,只不过函数的名称有点怪,是个运算符。不过这给编程带来了方便,适当重载,可以使得程序变得简洁。 对于操作符重载,我一直停留在浅尝辄止的程度,对于操作符的细节了解不多。所以今天花时间仔细的研究了一下。 在众多的操作符中,输入和输出流的操作符虽然平时一直在用,但是最不了解,因此我重点学习了>>和<<的用法。 首先需要弄清楚cin和cout是什么。cin和cout不是类,而是类的实例对象。cin是istream类的对象,cout是ostream类的对象(以前一直忽视这个问题,cin和cout是什么一直都模模糊糊的)。这样很容易就知道,cin具有istream的所有方法和变量,cout同理。 然后以cin为例来看>>的使用方法: string name; cin>>name; 从上面的例子可以看出>>是一个双目操作符,两个操作数分别是cin和name,所以在重载>>的时候参数列表中应该含有两个操作数,一个是istream类型的对象,另一个是自定义的对象。 那么>>操作符的返回值是什么? 事实上,>>操作符可以没有返回值,它的作用是从cin对象中提取数据到变量中,程序可以从输入流中获取数据。需要注意一点,如果只输入一个对象可以没有返回值,如果需要链式输入,那么就要返回输入流的引用,以便和下一个变量运算。 了解输入流的细节之后,重载才会方向明确。

重载操作符号

痴心易碎 提交于 2020-02-15 05:17:36
前几天一同学说去**面试,被问到现场写一个string类出来。 要写出这个类,主要知道几个默认构造函数,这个也是面试中常考的。 第一:拷贝构造函数。string(const string &lhs); 第二:赋值构造函数。string & operator=(const string &lhs) //这里就有2个问题 第一:赋值构造函数为什么是返回string &//这里是一个引用。 第二,operator=(const string &lhs)这里为啥只有一个参数。 对于第一个问题。我们知道,=(赋值)操作符,在c++语言在的意义是 a=b。 就是b赋值给a。所以,当你构造好这个对象之后,事实上,返回的就是这个对象了,当然是引用了。 第二个问题,为啥只有一个参数呢。 如果operator=操作符是类的成员变量,事实上,他有一个隐藏的函数参数,就是this了。 ============== string.cpp:40: error: `String& operator=(const String&, const String&)' must be a nonstatic member function //尝试将operator=放到类外面时候,报了这个错。 1 #include<stdio.h> 2 #include<string.h> 3 class String 4 { 5

7--操作符重载(2)

泪湿孤枕 提交于 2020-02-15 04:34:11
(1)一般运算符重载 在进行对象之间的运算时候,程序会调用与运算符相对应的函数进行处理, 所以运算符重载的方式有两种:成员函数和友元函数。 成员函数的形式 比较简单,在类里面定义一个与操作符相关的函数。友元函数因为没有 this指针,所以形参会多一个。 class A { public : A( int d) : data(d){} A operator + (A & ); //成员函数 A operator - (A & ); A operator * (A & ); A operator / (A & ); A operator % (A & ); friend A operator + (A & ,A & ); //友元函数 friend A operator - (A & ,A & ); friend A operator * (A & ,A & ); friend A operator / (A & ,A & ); friend A operator % (A & ,A & ); private : int data; }; (2)关系运算符 关系运算有 ==,!=,< ,<=,>>=等。这里只给出成员函数声明 bool operator == ( const A & ); bool operator != ( const A & ); bool operator < =

笔记四 操作符重载

人盡茶涼 提交于 2020-02-15 04:33:22
一 操作符重载 1 string类的定义: #include<iostream> class String; istream& operator>>(istream &, String &); ostream& operator<<(ostream &, const String &); class String{ public: //构造函数的重载集合 String(const char *=0); String(const String &) ~String(); String& operator=(const String &); //拷贝赋值操作符 String& operator=(const String *); char & operator[] (int)const; bool operator==(const char *)const; bool operator==(const String&)const; int size() { return _size; } char *c_str() { return _string; } private: int size; char *_string; } #include<cstring> inline String& String::operator+=(const String &rhs) { if(rhs.

函数的调用及重载

半世苍凉 提交于 2020-02-15 02:21:12
函数的调用 1.格式: 函数(参数1,参数2,…) 2.函数不调用不调用是不会执行的 3.函数调用的三种格式 如果调用函数没有返回值, 直接调用即可 如果调用函数有返回值 如果结果要在其他位置使用,使用变量存储方法调用的返回值 如果只想输出函数的返回值, 直接把方法的调用写在输出语句中的小括号中函数执行内存 调用:通过函数名和参数列表共同确定一个函数; 好处:让开发者需要记忆的函数名大大降低,提高开发效率。 递归调用: 人用迭代,神用递归 什么是递归 方法自身调用自身即为递归 递归:先递,后归。我们可以把递归分成三个部分,即: 前进段:指的就是讲问题从大化小 结束段:问题无法再继续化小,则处理当前的问题 返回段:将小问题处理完毕之后,向上返回(有些问题是不需要返回的) 递归和循环编写必须的三个部分: 初始值 终止条件 前进步长 递归主要解决的问题: 阶乘 /** * 计算5的阶乘(result = 5*4*3*2*1) * @author Champion.Wong * * */ public class Jiecheng { public static void main(String[] args) { System.out.println(f(5)); } public static int f(int n) { if (1 == n) return 1; else

java方法重载学习笔记

只愿长相守 提交于 2020-02-13 02:43:13
java中方法的重载 (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。 重载Overloading是一个类中多态性的一种表现。 (2) java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。 (3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。 方法重载的规则: 1、必须具有不同的参数列表; 2、可以有不同的返回类型,只要参数列表不同就可以了; 3、可以有不同的访问修饰符; 4、可以抛出不同的异常; 来源: https://www.cnblogs.com/LH923613603/p/6828303.html

C++总结(二)

ε祈祈猫儿з 提交于 2020-02-12 02:31:24
一、this指针 1、概念 :类非静态成员函数的第一个隐藏的参数,该参数使用指向调用当前函数的对象 2、特性 : this指针类型:T* const 普通类型成员函数:T* const 可以修改对象的内容,可以调用普通和const类型的成员函数 const类型成员函数:const T* const:this指向不能修改并且指向对象中的内容也不能修改,只能调用const类型的成员函数 this是非静态成员函数的第一个隐藏参数,隐藏:用户在编写函数时不用给出this的参数,该参数是编译器自己维护,调用该函数也不需要手动传递,this指针的传参也是编译器自己进行 this指针只存在于正在运行的成员函数中,this指针不会存在于对象中,不会影响类对象的大小 静态成员函数:没有this指针 this指针的传递:一般情况exc寄存器(this_call:调用约定),也可能通过参数压栈的方式进行传递:push 对象地址(比如:类中如果包含不定参数的成员函数) 3、this指针是否可以为NULL 如果成员函数是通过对象的方式进行调用,this指针一定不会为NULL: 如果成员函数是通过类类型的指针方式进行调用,this指针可能会为NULL: 4、this指针位置:栈 类的编译过程: 1、识别类名 2、识别类中的成员 3、识别类中的成员函数,并对成员函数进行改写 二、类中六个默认的成员函数 1

赋值运算符重载以及细节上的问题(operator=)

空扰寡人 提交于 2020-02-11 22:47:19
我们在学习类的时候知道一个完整的类中应该存在大默认函数函数: 1.构造函数 2.析构函数 3.拷贝构造函数 4.赋值运算符的重载函数 5.取地址操作符的重载函数 6.const修饰的取地址操作符的重载函数 构造函数,析构函数,拷贝构造函数大家应该不怎么陌生,今天给大家讲解一下我理解的赋值运算符重载函数并且讲一下里面需要注意的易错点(这些易错点都是血与泪的教训) 首先赋值运算符的重载顾名思义就是:“重新定义一下‘=’这个符号”,可能大家要问什么时候需要重载运算符?为什么要重载呢? 用途: 首先我们说运算符的重载是针对类生成的对象而言的,当我们有了对象A新对象B,我们想把对象B赋给对象A时(意思就是让对象A和B完全一样)这时候就需要用到赋值运算符的重载,在我们类中就有默认的赋值运算符重载函数,但是它适用的场景很少,所以大多数情况我们都需要自己实现赋值运算符的重载。 #include<iostream> #include<string.h> class CMystring { public: CMystring(char*pdata=NULL);//构造函数 CMystring(const CMystring&str);//拷贝构造函数 ~CMystring();//析构函数 CMystring&operator =(const CMystring&str)//赋值运算符的重载 { if

new和delete关键字

。_饼干妹妹 提交于 2020-02-11 14:11:59
new关键字创建出来的对象位于什么地方? 很明显嘛,new关键字创建出来的对象一定位于堆空间,这种说法一定正确吗?本篇博客帮你揭开其神秘的面纱。 被忽略的事实 new/delete的本质是C++预定义的操作符 C++对这两个操作符做了严格的行为定义 -new: 1.获取足够大的内存空间(默认为堆空间) 2.在获取的空间中调用构造函数创建对象 -delete: 1.调用析构函数销毁对象 2.归还对象所占用的空间(默认为堆空间) 在C++中能够重载new/delete操作符 全局重载(不推荐) 局部重载(针对具体类进行重载) 重载new/delete的意义在于改变动态对象创建时的内存分配方式 new/delete的重载方式 //static member function,写不写static都是静态成员函数。 void* operator new(unsigned int size) { void* ret = NULL; /*ret pointer to allocated memory*/' return ret; } //static member function void operator delete(void* p) { /*free the memory which is pointed by p*/ } 来源: https://www.cnblogs.com/-glb

c++ 面试整理

别说谁变了你拦得住时间么 提交于 2020-02-11 02:58:10
1. 继承方式 public   父类的访问级别不变 protected 父类的public成员在派生类编程protected,其余的不变 private 父类的所有成员变成private #include <iostream> using namespace std; class base { public: void printa() { cout <<"base"<< endl; } protected: void printhello() { cout <<"helo"<< endl; } private: void printnohello() { cout <<"no hello"<< endl; } }; class derived : public base { public: void printb() { printhello(); } // void printc() { printnohello(); } //printnohello是父类的私有函数,不可访问 }; int main() { base a; a.printa(); //a.printhello(); //printhello是类derived的protected函数,不可访问。 } 2. sizeof 和 strlen 的区别 sizeof 是一个操作符,strlen 是库函数。