Transcript for:
C++ Operators and Overloading Techniques

就是你在透过这个operator做存取的时候他会先判断你的subscript是建于0到10之间对他那个resize是所以他会有这个判断性如果超过的话他会印出这个out of range的错误讯息所以你在使用上面不用太担心因为在硬件里面他都有去执行这个 好到这里ok吗好那这里case study呢基本上就是在接下来这个内容就在讲说那个程式码刚刚看到那个程式码它的一些说明那 假如我没有上课的话其实你看这个说明也许你慢慢看你可能会看得懂那你会发现这个内容我大概就简单带过去你刚刚其实都讲过就是简单来说就是我们在 array 的 class 里面其实有两个constructure一个叫做一般的 default 的constructure另外一个是 copyconstructor那 copyconstructor 还包含这一行 我们刚刚看到的例子是array然后空一个integers3然后挂号一个东西这一行基本上也是CopyContracture在执行它并不是assignment虽然我们看到的是一个等约符号但它并不是assignment这个是CopyContracture差别分别怎么做区别就是如果你是宣告的时候同时给它一个值这个就是CopyContracture如果 你不是在宣告的时候是你先宣告完Integer3然后你下一行你在写Integer3.Integer1在这个情况下就是 assign可是如果是你同时宣告再给它一个等号的符号然后后面写一个字的话那它就是一个 copy construction那ok这个是注意一下就是它最后最终执行的是这一行而不是下面那个 那另外一个是我们在class里面有实作operator通过号那这个operator通过号呢我们刚刚传进来的是一个integer但是因为这是你自己实作的你以前在使用阵列的时候呢从Domain type你一定要传入一个整数因为它告诉你是阵列的地球位可是呢现在是你自己实作的所以 里面传进来它不一定要是Integer它可以是Character它可以是Double它可以是随便你指定一个东西因为那是你自己实作的你想要它传Integer进来你就让它传Integer然后你想要让它传其他的Type你就让它传其他的Type当然你要有对应的操作手法所以刚刚传的Integer是因为这里我们定义的是一个Integer这里 我们定义的是integer你可以传入别的形态这个是没有问题然后另外一个是operator两个小鱼跟两个大鱼这个我们其实当时有说过就是当你要 写一个operative overloading function的时候你可以写在部件的member function前面的那个部件的member function里面或者是to global的方式来实作那在这个情况下我们因为不能把你的实作细节写在Cinco跟Cout里面因为那是C++ standard language他们所开发的你把你的member function写在那以后你就会 导致你的FDL library跟人家的不一样所以这边我们就是只能写成一个Global function然后这种刚好提过就是ConstantCopy constructor里面你传进来的东西必须要通过pass-by-value你要通过pass-by-value然后怕你传进来的你要通过pass-by-reference来做传递 然后传进来的东西我们又怕被修改所以前面我们加上一个constant 如果你没有透过 Passed by Reference 的方式来做传递的话它就会一直呼叫它自己因为它会一直产生你在传递的时候你要一直制造一些新的复制品然后那个复制品你要对它做初始化它就会一直这样呼叫自己呼叫不完这样子然后 Array这个物件它在实作的时候它会有使用到动态的记忆体就是你在constructor传入一个阵列常驻然后它接下来它就会帮你透过动态方式去跟系统要记忆体既然是动态方式去要记忆体你在destructor再释放掉再把Array物件释放掉的时候你同时也要去自己动态释放掉记忆体否则 你只是释放掉TT这个指标而已你那他指标指标好到这也可以到现在已经大了你知道吗等一下我们先休息的时候我就会去跟助理我们就换去楼上看一下看有没有 然后还有integers1.integers2在这一行后面就是在程式码里面的后面一行它写integers1.integers2这里就是assignment刚刚有一个case是copy construction你宣告的时候直接在宣告那个物件的后面写代表于什么东西那个就是copy construction但是这一行比较呼叫的就是assignment这个方式我们刚刚有特别强调的是你回传的 这个array必须要是一个constant否则你可能就会让这样的一个语法你可以执行挂号X&Y然后挂号的语法也可以执行但是执行完之后你可能得到的就不是一个你想要的结果这样这是一个问题好然后这个tip在这里11.5这个tip呢 他现在讲的是说我们在开发class的时候其实C++有帮你做很多的事情包含像是他预设帮你他帮你开发一个预设的copy controlOK你就算没有写copy control他也会帮你开发然后他也会帮你开发一个assignment就是如果你都没有写的话你一样可以写data1.data2 这种东西然后 他也会帮你开发这个的structure但是前提就是说如果你没有动态的去使用记忆体的话那这些大概不太会出错可是如果你你的class里面有动态的去跟系统要记忆体的话那这些东西constructordestructor跟所有的overloaded assignment这下progression就全部都要拿进行实作如果你没有进行实作呢其实就可能会出事 好那这边一样如果对于你在没有使用动态的晶体的话那又没有提供 overloaded environment那这个其实在程序上就往外处处然后你的程序码如果写到input just one 0.1 Integer2,它包含像其他的Architecture都一样就是Compiler看到这样的一个程式码的时候它会帮你转译,转译成这个形式它会变成Integer1.Architecture然后等于的按呼叫这个方式扣然后把Integer2给传进来再帮你转译所以使得说你阅读的时候它是比较轻松的但是实际上在实体还是跟以前差不多 我们刚刚我们先前在讲这个例子的时候有遇到一个金汉套不等于的这种case那这种不等于的case如果你还有印象就是它在实作上它其实使用了叫等于等于的方式来发出实作对不对就是先判断你的答案是不是等于 在哪里这么远这里是等于的对不对然后前一个是不等于还是写在前面写在definition这里就是在不等于的地方 然后它实际上做的事情就是先判断两个物件有没有相等如果相等可以看到吗先判断两个物件有没有相等然后如果相等的话不管有没有相等就是你判断完结果前面加上一个新参号再把它判过那就是不相等的意思好那这个有什么好处呢就是你可以reuse你的程序 给你reunit你的程式然后之后你的程式在做修改之后就会比较有效率就是你不用比如说你要修改这个等于等于判断的方式等于法这样子然后你不用修改完之后你再跑去改不等于等于法这样子你只要改一个方式就好你改完了另外一个方式操作方式也会跟着改这样子 这个是一种reuse的一个机制一个技巧我们要不要先现在就先换过去我现在先换过去好了先暂停一下然后我们搬到114或114我们先去找114好了换对不对你只要再 因此前面写一个括号double然后compiler就会自动帮你把int这个形态转换成double这样子当然你可以反过来做这样一个转换现在会是自己define你自己define一个新的形态对所以一样的如果我要做形态转换的时候你必须要自己告诉你的compiler这些物件彼此之间在形态上做转换 那这种转换呢必须要是做在Static的MemberFounder上因为你既然是要做形态的转换代表说你的物件里面一定有你就是要把那个词的形态转换过去所以它不可以是StaticStatic的话就是物件跟里面的内容是没有关系的所以怎么做转换呢就是一样会有一个所谓的 Converting的function那这个Converting的function呢呃长这样子看起来有点怪但是呃这个就是你Converting的functionA 帽号A两个帽号呢这个是一个形态这里硬件的一个class的名称那后面有一个function呢叫做Operator.Character.Stop然后这个东西呢就是说我想要把我的物件A这个物件呢转换成 CharacterStart如果你是要转换成Integer那这个CharacterStart就改成IOT或者是你想要改成别的形态就把那形态的资料转去然后后面加两个括号那括号一样就是因为它是个方式所以就会有括号只是说你在做形态转换的时候括号里面是不会有东西因为你是要把物件本身里面的资料做个形态的转换所以这里虽然有括号 但他不会传入任何东西进来他后面是一个constant代表说我们只是负责读取这个资料然后转换结果我们从网块传入去我们不会去更改到里面因为它只是一个形态的重发好那这个casting呢这个cast operator呢他也不会回传一个return typeok他没有return type这个其实比较特别 就是虽然它是一个function然后它最前面写一个class然后在这里是不会写return type因为你的return type在这里是定法你的return type在这里因为在最前面不会去scan out这个return type是什么那在使用上以前你的写法就比如说你会写一个 对不对 这是你以前想要做的事情 后面是你的变数名称然后前面用小括号把它挂起来就是写你想要转换过去的形态但是对于class来说你要写成这个形式我们最前面写了一个static然后detects然后小括号下语音跟大语音组成的这一组括号然后里面传入character style后面这里的括号s是你原本的形态 下面我这个是仿LomentoType的写法这是你们以前用法但对于class来说UserDefinedType你必须要这样子写就是Static.Event.Class然后我们的小无名这是大理数组成的括号它里面传入CurveStart代表说我要把Hash这些路线转换成CurveStart那当Compiler看到这样一行程式的时候它会去帮你执行这个As the operator然后空一个CurveChat算好了那所以呢 实际上就是它去呼叫这个物件对不对你要把 s 转换成 character star所以呢它是去呼叫 s 的物件然后里面有一个方形叫做 operator通过 character star好然后这里有另外一个例子是怎么写一个customize integercustomize iot 然后里面有个int的setter member叫data然后在data里面在这个customize integer里面它有一个construction然后有另外一个constructiondefault是没有传送任何信息然后另外一个是透过一个int来做数字化那这边有一个叫做operator on sign long int然后传入一个 这么长的东西就是我之后想要转型它这是在这个flash里面博主提供的转换所以你可以把int转换成 sign-on本来是一个int你把它转换成另外一形态叫 sign-on int后面有一个括号这是因为它是个方形最前面记得这边没有 我会向这开operator这里其实也是一个function的语称那转换的方式这个大概就很简单就是我们就写一个onsilonint output然后 output等于onsilonint然后括号beta那里面的这个写法会跟你们以前学到的一样我把beta这个形态因为int的形态转换成onsilonint然后变成output然后最后再入行output但是这边只要demo说你的function要 它是什么东西那里面这里就大家自己看一下图实化的时候我们把data设成然后在main function里面可以宣告一个X,customize int x然后呢转换成这个onsign on int yx 这个写法也是OK的就是你直接把X就是给定一个Sino-IT然后这样的话你compiler就放一种好所以OK吗好然后 如果没有问题我们就继续后面这边有另外一个例子叫做StringString Class那这里可能稍微提一下就是我们这里面的例子就是你在使用String这个class的时候这个String是STL帮你开发的然后它也有帮你输出很多跟自串处理 相关的一个方式那当然以诚他在实作上呢会是透过一个Curriculum StartCurriculum Array的方式去做实作的这样子那这边要提一行程式码就是看一下后面应该是有意思先看一下 我觉得我们先讲这个例子 然后再回过头去讲刚才的东西Anyway就是这个String是一个物件然后它是直接在放进去那在这个Piece里面我们会有一个S1叫做HappyS1我们要传入一个CharacterRank然后这个CharacterRank里面内容就是Happy然后另外一个传入S2然后我们宣告一个S2 然后呢,Copy construction转入这个First Date那会有另外一个计算的叫S3那你可以有一些方式给它做输出那这个是其中一种那在这个三个String的物件里面呢我们可以透过输出你会可以透过Cout直接在String去做输出比如说你可以写Cout,然后小微小于S1,小微小于S2 然后就可以把这三个字串直接印到支付室上之所以这一行可以执行这都是因为你的compiler以及方案你实施做好operator overloading就不用再自己用了再不用再自己写了所以这样子它就可以马上执行然后你也可以判断他们两个有没有一样判断他们两个是不一样然后S2是多大于S1 然后S2是我想S1大约等于相比这个都已经有现成operator丶加加帮你去做好看那如果到这里你可以回顾一下当初你在写第一个lab的时候就是你用template去写然后这个就要给你自串的力那自串一样可以比大小那之所以可以比大小是因为operator overloading在stream里面有这个operator overloading 已经买起做好比较大小的方式原则上就是以字元大小来做比较因为我们知道说自串它有很多的字它是有两个字元设定所以他们都会先比较两个字串的第一个字元看谁比较大OK他们会先比较两个字串的第一个字元看谁比较大所以比较方式因为字元是一个character它是介于领导 25之间的数字对不对然后呢那个字元本身有个数字所以呢他就会比那个数字对不对然后呢先比第一个字元第一个字元比完之后如果可以分出大小那就会是字元数大会大于另外字元数项你的字串呢就会是比如说A跟B好了A这个A跟B两个字串 他们的第一个字元是A比较大然后B的第一个字元比较小那这样画的A字串就会大于B然后如果B的字元无法分出大小的广那就会跳到第二个字元再比一次如果可以分出大小那就是看谁大然后如果还是不行就跳到第3个第4个一路跳到最后这样是OK这个是字串 比较大小的方式那在C++里面它的字串你也可以透过这个MT function去判断说这个字串是什么然后你可以对它做直接写s3x1这样子然后你可以加等那在字串的制作方式你只要看到加代表的就是两个做卡的表现它不是两个数字相加而是两个字串去提起 然后你可以写这个s1加等然后括号这样这是一个字源除此之外你可以透过substrain去取得你想要的状态比如说s1.substrain的话0跟14代表说他可能这个字串来很长但是我只想要取第0个字源到第14个字源这个字串这样的话他也会回想一个字串 但它就是一个子字串然后你也可以随时取其中一个字元比如说你写s1.substring然后括号输就可以取得第十五个字元以上然后这个是computing construction你可以写string然后空一个s4然后括号s1然后assignment然后取得某一个位置的字元比如说我把s1的第五个字元能改成大写h 然后S1的第六个资源改成大显示所以刚刚本来最前面这里 你的S1跟S2是Happy Birthday然后S跟B是小喜那透过执行这两个行程是S10改成大写SS16改成大写B然后你接下来得到的印出来的结果Happy Birthday就会是大写的Happy BirthdayOK然后最后这里还有一个S1 然后括号重复三次这个写法跟上面的这个X1括号5或括号6的写法基本上是一样的它的作用是一样的但它们还是有一些差别就是一样的点在于说你都是要存取第几个位置比如说第0的第6个第30个位置的那个字你可以去读取它的字你可以去修改它的字它差别在于说这个X呢 会多一个盘动就是它会帮你解你现在要存取的资源阵列你现在存取的位置究竟有没有超过资源阵列的范围如果有超过资源阵列的范围它会丢一个exception出来在这里我们没有看到任何的实度但是在C++的library里面它会使用的try catch的exception就是我们之后一个章节在讲例外存在你的城市执行代理办的时候 可能会出现一些例外然后如果出现例外的话它会跳出一些错误的评价这个at跟上面这个中国号最主要差别就是在于说at会有例外的实作所以如果你的你想要access的位置超过半的话它就直接告诉错在什么地方好 那通过号就没有所以错了就错了你错了可能就会出现一些magnum的误会然后如果你以前也在写词的时候我不太确定了就是这个机体出错不一定会让你的程序环起来它也不会跳出什么机体错误去写不一定有时候会有时候不会然后有时候所谓不会的状况就是它还是继续跑只是你最后跑出来结果就不是一样 它的数值错误不一定都会挑出错误层次也会被关掉但是如果你用改整的话它就告诉你说你要从这个范围里有问题然后我们回到刚刚前面OK 你可以透过String的class然后来做一些计算处理跟操作然后在底层它还是一样CursorRate然后通常在程式码里面就是说这里比较特别就是如果你看到这一行写myString等于括号Hello的话我们直觉上会认为说在String的 算是开发的过程当中会有一个operating overload叫做assignment然后这个assignment传进来的变数可能会有自传可能会有class string class或者是一个character的文章但实际上它传进来的时候这里是一个character ring那assignment operator并没有推实做法 Curriculum rate 传到那个磁场的这个它并没有一个 operator 加然后传入你看看我这样写会太难看我把它放大就是这是 operator 加然后传入一个 constant 的 character 然后后面你基本上要再加上跟他们变数但总之我要说的是其实不存在的方式这个方式其实是不存在并没有这个方式存在没有这个方式存在的时候为什么这一行还可以执行就是你写mystream等于一个PyLo的资源整理的时候为什么这一行还可以执行因为 新加价的compiler他会做一件事情 就是myString在做初始化的时候它所使用的copy control是必须要传入它必须要传入String这个部件myString这个部件在做初始化的时候它要传进来是理论上它要传进来是一个String的object但是它现在拿到了一个territor rate所以它会做一件事情是它会试着帮助你 拿 character.reg 去初始化一个暂存的字串然后帮你转过去之后再来看可不可以 assign 过去我再讲一次Compiler 看到 myString 这个部件的时候它理论上因为等于是要传入一个 string对不对 你理论上要传递一个String可是它现在拿到的是一个资源阵列它不是一个String Object所以它会做一件事情试着比如说试着先自己宣告一个叫Tag暂存的String然后这个暂存的String用Hello来对它做出指挂 所以它就变成一个tank的部件然后接下来再等于把这个tank的部件包括等于operator转给mustrain它其实不是直接拿hello这个自换 自圆阵列去初始化mustrain而是它发现怎么两个形态不一样之后它会先宣告一个tank的部件然后拿hello的 支援这边去初始化TEM物件然后TEM物件再拿去assign给MyStream它是这个过程它会试着帮你把卡漏这个自传转换成Stream的物件然后再把Stream物件拿去等你MyStream拿去传给MyStream这是它的过程其实在很多地方也都会有这样的例子 然后会给一个case然后实际上刚刚遇到的case遇到这个Hello或者这个Happy他们其实都是通过CopyControl所做的因为你把资源阵列传给一个CopyControl去初始化一个字团一个String的物件然后再通过这个String的物件去给另外一个String