|
|
(не показаны 1674 промежуточные версии 33 участников) |
Строка 1: |
Строка 1: |
− | ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÿÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂûÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂþÃÂÃÂÃÂàÃÂÃÂÃÂþÃÂÃÂÃÂñÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ
ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂúÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂù ÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂü, ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂþ ÃÂÃÂÃÂøÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂþÃÂÃÂÃÂÿÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂûÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂýÃÂÃÂÃÂÃÂÃÂÃÂÃÂõ ÃÂÃÂÃÂþÃÂÃÂÃÂóÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂàÃÂÃÂÃÂÿÃÂÃÂÃÂþ ÃÂÃÂÃÂúÃÂÃÂÃÂþÃÂÃÂÃÂûÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂòÃÂÃÂÃÂÃÂ
| + | Операторы отличаются от обычных функций тем, что имеют определенные ограничения по количеству |
− | ÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂóÃÂÃÂÃÂÃÂÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂò, ÃÂÃÂÃÂð ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂúÃÂÃÂÃÂöÃÂÃÂÃÂõ ÃÂÃÂÃÂýÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂõ ÃÂÃÂÃÂþÃÂÃÂÃÂöÃÂÃÂÃÂøÃÂÃÂÃÂôÃÂÃÂÃÂðÃÂÃÂÃÂõÃÂÃÂÃÂüÃÂÃÂÃÂþÃÂÃÂÃÂõ ÃÂÃÂÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂòÃÂÃÂÃÂõÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂõ. ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÿÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂÃÂ, ÃÂÃÂÃÂþÃÂÃÂÃÂÿÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂà+ (ÃÂÃÂÃÂÃÂÃÂÃÂÃÂûÃÂÃÂÃÂþÃÂÃÂÃÂöÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂõ), ÃÂÃÂÃÂÿÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂüÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂù
| + | аргументов, а также некоторое ожидаемое поведение. Например, оператор + (сложение), принимающий |
− | ÃÂÃÂÃÂñÃÂÃÂÃÂþÃÂÃÂÃÂûÃÂÃÂÃÂõÃÂÃÂÃÂõ ÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂü ÃÂÃÂÃÂþÃÂÃÂÃÂôÃÂÃÂÃÂøÃÂÃÂÃÂý ÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂóÃÂÃÂÃÂÃÂÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂÃÂ, ÃÂÃÂÃÂòÃÂÃÂÃÂÃÂÃÂÃÂÃÂóÃÂÃÂÃÂûÃÂÃÂÃÂÃÂÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂû ÃÂÃÂÃÂñÃÂÃÂÃÂàÃÂÃÂÃÂóÃÂÃÂÃÂûÃÂÃÂÃÂÃÂÃÂÃÂÃÂÿÃÂÃÂÃÂþ. ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂüÃÂÃÂÃÂõ ÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂóÃÂÃÂÃÂþ, ÃÂÃÂÃÂòÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂô ÃÂÃÂÃÂûÃÂÃÂÃÂø ÃÂÃÂÃÂúÃÂÃÂÃÂÃÂÃÂÃÂÃÂþ-ÃÂÃÂÃÂÃÂÃÂÃÂÃÂþ ÃÂÃÂÃÂöÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂàÃÂÃÂÃÂþÃÂÃÂÃÂàÃÂÃÂÃÂþÃÂÃÂÃÂÿÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂð ÃÂÃÂÃÂÃÂÃÂÃÂÃÂûÃÂÃÂÃÂþÃÂÃÂÃÂöÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂÃÂ
| + | более чем один аргумент, выглядел бы глупо. Кроме того, вряд ли кто-то ждет от оператора сложения |
− | ÃÂÃÂÃÂøÃÂÃÂÃÂ÷ÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂõ ÃÂÃÂÃÂþÃÂÃÂÃÂñÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂÃÂÃÂÃÂÃÂð, ÃÂÃÂÃÂôÃÂÃÂÃÂûÃÂÃÂÃÂàÃÂÃÂÃÂúÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂóÃÂÃÂÃÂþ ÃÂÃÂÃÂþÃÂÃÂÃÂý ÃÂÃÂÃÂòÃÂÃÂÃÂÃÂÃÂÃÂÃÂ÷ÃÂÃÂÃÂòÃÂÃÂÃÂðÃÂÃÂÃÂý, ÃÂÃÂÃÂøÃÂÃÂÃÂûÃÂÃÂÃÂø ÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂóÃÂÃÂÃÂÃÂÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂÃÂÃÂÃÂÃÂð.
| + | изменение объекта, для которого он вызван, или аргумента. |
| | | |
− | ÃÂÃÂÃÂàÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂüÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂü ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂ÷ÃÂÃÂÃÂûÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂÃÂÃÂÃÂÃÂõ ÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂÿÃÂÃÂÃÂàÃÂÃÂÃÂþÃÂÃÂÃÂÿÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂò ÃÂÃÂÃÂñÃÂÃÂÃÂþÃÂÃÂÃÂûÃÂÃÂÃÂõÃÂÃÂÃÂõ ÃÂÃÂÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂôÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂñÃÂÃÂÃÂýÃÂÃÂÃÂþ.
| + | Рассмотрим различные типы операторов более подробно. |
| | | |
− | i5ZE1g <a href="http://qmlunrxnlfad.com/">qmlunrxnlfad</a>, [url=http://secdzqkuvdic.com/]secdzqkuvdic[/url], [link=http://wniuyjxuhboe.com/]wniuyjxuhboe[/link], http://vldlnwbycabq.com/
| + | == Арифметические == |
| | | |
− | Paced World, http://bycksowleb.typepad.com/blog/2012/02/sample-of-spouse-sponsor-letter.html Sample Of Spouse Sponsor Letter, 956, http://zskwfiedx.typepad.com/blog/2012/02/cold-one-apotamkin-legends.html Cold One Apotamkin Legends, rmv, http://zvnmdbuo.typepad.com/blog/2012/02/crafts-lighted-tree-topper.html Crafts Lighted Tree Topper, >:-(, http://xqsktzeu.typepad.com/blog/2012/02/itunes-linux-decrypt.html Itunes Linux Decrypt, ajofz, http://mjmtkssjb.typepad.com/blog/2012/02/itunes-not-working-quicktime-problem.html Itunes Not Working Quicktime Problem, 8-DDD, http://jrtauoglom.typepad.com/blog/2012/02/itunes-lyrics-use.html Itunes Lyrics Use, >:-[[[, http://bbjwxwyn.typepad.com/blog/2012/02/contoh-cerita-narasi.html Contoh Cerita Narasi, 935946, http://hjmfhbnpbo.typepad.com/blog/2012/02/glasgow-german-market.html Glasgow German Market, =-D, http://milhvmweq.typepad.com/blog/2012/02/apple-itunes-contact-details.html Apple Itunes Contact Details, 872, http://puygejkfq.typepad.com/blog/2012/02/sites-like-ifeelmyself.html Sites Like Ifeelmyself, 940, http://iymdsyjk.typepad.com/blog/2012/02/itunes-sync-not-starting.html Itunes Sync Not Starting, whg, http://ddbstzyilr.typepad.com/blog/2012/02/itunes-sync-quality.html Itunes Sync Quality, :O, http://ifslqtcngu.typepad.com/blog/2012/02/itunes-movie-trailers-black-swan.html Itunes Movie Trailers Black Swan, %-OOO, http://jhdgkivn.typepad.com/blog/2012/02/itunes-download-bitrate.html Itunes Download Bitrate, wjo, http://gqylodwqd.typepad.com/blog/2012/02/pictures-of-safety-rules.html Pictures Of Safety Rules, nwan, http://efaplseg.typepad.com/blog/2012/02/bypass-facebook-at-work.html Bypass Facebook At Work, ejgpe, http://beerdywfp.typepad.com/blog/2012/02/how-to-make-a-spun-cotton-ornament.html How To Make A Spun Cotton Ornament, mljwpx, http://symvdmvz.typepad.com/blog/2012/02/married-cops-do.html Married Cops Do, >:[[[, http://whzoyosxz.typepad.com/blog/2012/02/acai-capsules-fake.html Acai Capsules Fake, sru, http://qqxljsydii.typepad.com/blog/2012/02/snowman-plywood-cut-outs.html Snowman Plywood Cut Outs, 8[[,
| + | К этому типу относятся следующие операторы: |
| + | * <tt>+</tt>, <tt>-</tt>, <tt>*</tt>, <tt>/</tt>, <tt>%</tt> |
| + | * бинарный сдвиг: <tt><<</tt>, <tt>>></tt> |
| + | * бинарная логика: <tt>|</tt> (или), <tt>&</tt> (и), <tt>^</tt> (исключающее или), <tt>~</tt> (не) |
| + | * инкремент и декремент: <tt>++</tt>, <tt>--</tt> |
| | | |
− | Important Attribute, http://baceotda.typepad.com/blog/2012/02/itunes-apps-kakuro.html Itunes Apps Kakuro, cnr, http://lliepsld.typepad.com/blog/2012/02/itunes-trailers-john-carter.html Itunes Trailers John Carter, icvk, http://ehutibphch.typepad.com/blog/2012/02/baji-aur-bhabhi-ko-chuda.html Baji Aur Bhabhi Ko Chuda, :-((, http://uwzwoumw.typepad.com/blog/2012/02/apps-like-itunes-for-android.html Apps Like Itunes For Android, %P, http://dzepgbnlt.typepad.com/blog/2012/02/itunes-keeps-freezing-while-syncing.html Itunes Keeps Freezing While Syncing, 11599, http://xlkjvnffy.typepad.com/blog/2012/02/battery-group-size-chart.html Battery Group Size Chart, zveh, http://zerjgyxoa.typepad.com/blog/2012/02/itunes-cloud-icon-meaning.html Itunes Cloud Icon Meaning, iviny, http://ugtmgwugn.typepad.com/blog/2012/02/itunes-codes-keygen.html Itunes Codes Keygen, :(((, http://jwwvyxyytx.typepad.com/blog/2012/02/acai-berry-capsules-on-ebay.html Acai Berry Capsules On Ebay, 592477, http://wytmombr.typepad.com/blog/2012/02/acaioptimumcom-login.html Acaioptimum.Com Login, feb, http://juestwovv.typepad.com/blog/2012/02/bakugan-hentai-online.html Bakugan Hentai Online, 736, http://tmpdoykys.typepad.com/blog/2012/02/proposal-kebidanan.html Proposal Kebidanan, %-[[, http://puaputyb.typepad.com/blog/2012/02/itunes-lp-plastic-beach.html Itunes Lp Plastic Beach, 1112, http://sebtpzrphf.typepad.com/blog/2012/02/contoh-paragraf-persuasif.html Contoh Paragraf Persuasif, %-[[, http://aowigmbha.typepad.com/blog/2012/02/halo-ce-product-key-gen.html Halo Ce Product Key Gen, 75668,
| + | Все арифметические операторы, за исключением бираного НЕ, инкремента и декремента, принимают |
| + | один параметр. Они не должны менять исходный объект и объект-параметр; результат операции |
| + | должен быть возвращен в виде вновь созданного объекта. Таким образом, и оператор и его аргумент |
| + | должны быть объявлены константными. |
| | | |
− | Rapper Tone Loc, http://tsddyobukt.typepad.com/blog/2012/02/itunes-restore-wont-work.html Itunes Restore Wont Work, tlr, http://zztjdymgf.typepad.com/blog/2012/02/itunes-account-authorization.html Itunes Account Authorization, egx, http://kuvyrssuj.typepad.com/blog/2012/02/itunes-app-store-password-reset.html Itunes App Store Password Reset, %], http://gwntsypwmk.typepad.com/blog/2012/02/klixen-rapidshare-download.html Klixen Rapidshare Download, txnozx, http://rloimmclnc.typepad.com/blog/2012/02/itunes-freezes-restoring-iphone.html Itunes Freezes Restoring Iphone, 97374, http://tqbyfetzhe.typepad.com/blog/2012/02/itunes-podcast-edit.html Itunes Podcast Edit, 8]]], http://zwcvxtskkd.typepad.com/blog/2012/02/boxing-day-menu-ideas.html Boxing Day Menu Ideas, 424858, http://dfjwpbfoec.typepad.com/blog/2012/02/itunes-trailers-jonah-hex.html Itunes Trailers Jonah Hex, jmnrs, http://scdkyarsp.typepad.com/blog/2012/02/acai-ultimate-body.html Acai Ultimate Body, %)), http://tcajrsoco.typepad.com/blog/2012/02/itunes-cleanup-youtube.html Itunes Cleanup Youtube, fit, http://gzrjefoq.typepad.com/blog/2012/02/maa-o-cheler-bangla-choti-golpo.html Maa O Cheler Bangla Choti Golpo, 8-D, http://owxwagfph.typepad.com/blog/2012/02/bot-runescape-woodcutting.html Bot Runescape Woodcutting, rkbhby, http://wecahkyfod.typepad.com/blog/2012/02/rope-lights-nyc-moving.html Rope Lights Nyc Moving, 786484, http://wlfiknae.typepad.com/blog/2012/02/itunes-quicktime-help.html Itunes Quicktime Help, 34968, http://uxffiduc.typepad.com/blog/2012/02/itunes-new-computer-sync-ipod.html Itunes New Computer Sync Ipod, :-DD,
| + | В качестве примера приведем реализацию некоторых операторов для класса двумерного вектора: |
| | | |
− | == ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÿÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂàÃÂÃÂÃÂøÃÂÃÂÃÂýÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂþÃÂÃÂÃÂóÃÂÃÂÃÂþ ÃÂÃÂÃÂôÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÿÃÂÃÂÃÂð == | + | <source lang="kpp"> |
| + | class Vector2 { |
| + | var real m_x, real m_y; // координаты |
| + | public: |
| + | property real x read m_x write m_x; |
| + | property real y read m_y write m_y; |
| + | |
| + | // конструктор для упрощения создания объекта |
| + | constructor create(const real X, const real Y) |
| + | { |
| + | var self = new Vector2; |
| + | self.m_x = X; |
| + | self.m_y = Y; |
| + | return self; |
| + | } |
| + | |
| + | // операторы сложения и скалярного произведения векторов: |
| + | const operator Vector2 + (const Vector2 arg) |
| + | { |
| + | // возвращаем новый объект в качестве результата! |
| + | return Vector2.create(x + arg.x, y + arg.y); |
| + | } |
| + | |
| + | const operator real * (const Vector2 arg) |
| + | { |
| + | // скалярное произведение |
| + | return x * arg.x + y * arg.y; |
| + | } |
| + | }; |
| + | </source> |
| + | |
| + | |
| + | == Операторы сравнения == |
| + | |
| + | Существует 6 операторов сравнения: "меньше", "больше", "меньше или равно", "больше или равно", "равно" и "не равно" - |
| + | соответственно, <tt><</tt>, <tt>></tt>, <tt><=</tt>, <tt>>=</tt>, <tt>==</tt>, <tt>!=</tt>. |
| + | |
| + | Все эти операторы также должны принимать один параметр, не должны изменять объект и параметр, а кроме того, все они |
| + | должны возвращать в качестве результата логическое значение - true или false. |
| + | |
| + | '''Примечание:''' в стандартной библиотеке языка K++ объявлен класс-[[примесь]] [[Comparable]], который упрощает реализацию |
| + | этих операторов. |
| + | |
| + | Достаточно унаследовать свой класс от [[Comparable]] и определить в классе метод <tt>compare</tt>, который принимает один |
| + | аргумент и возвращает значение |
| + | * меньшее нуля, если объект меньше аргумента; |
| + | * равное нулю, если объект равен аргументу; |
| + | * большее нуля, если объект больше аргумента. |
| + | |
| + | Все остальные операторы, а также метод <tt>between</tt>, определены в [[Comparable]]. |
| + | |
| + | == Операторы присваивания == |
| + | |
| + | Оператор присваивания <tt>=</tt> - это оператор, который копирует значение своего аргумента в текущий объект. |
| + | |
| + | Кроме того, каждому арифметическому оператору соответствует оператор присваивания, имя которого составляется из |
| + | имени математического оператора плюс символ "=" (например, <tt>+=</tt>). Такие операторы делают соответствующее |
| + | математическое действие с текущим объектом. |
| + | |
| + | Операторы присваивания изменяют текущий объект, но не изменяют аргумент. Все они, кроме <tt>~=</tt>, <tt>--=</tt> |
| + | и <tt>++=</tt>, принимают ровно один аргумент. |
| + | |
| + | Операторы присваивания должны возвращать текущий объект в качестве результата. |
| + | |
| + | Операторы <tt>--=</tt> и <tt>++=</tt> соответствуют префиксному инкременту и декременту. |
| + | |
| + | Для того же класса <tt>Vector2</tt> из предыдущего примера: |
| + | |
| + | <source lang="kpp"> |
| + | operator Vector2 += (const Vector2 arg) |
| + | { |
| + | x += arg.x; |
| + | y += arg.y; |
| + | return this; |
| + | } |
| + | </source> |
| + | |
| + | |
| + | == Операторы приведения типов == |
| + | |
| + | Часто бывает так, что одни и те же объекты могут быть представлены различными способами. Например, число 5 может |
| + | быть представлено как целочисленное 5, вещественное 5.0 или в виде строки "5". |
| + | |
| + | Операторы приведения типов позволяют преобразовывать объекты из одних классов в другие. |
| + | |
| + | Имя такого оператора совпадает с именем класса, в который производится преобразование; оператор не принимает |
| + | параметров и не должен менять текущий объект. |
| + | |
| + | При объявлении оператора приведения типа, тип результата функции указывать не следует. |
| + | |
| + | Продолжим пример с двумерным вектором. В некоторых задачах бывает целесообразно определить преобразование вектора |
| + | в вещественное число, возвращающее длину вектора. |
| + | Это можно сделать следующим образом: |
| + | |
| + | <source lang="kpp"> |
| + | const operator real () |
| + | { |
| + | return sqrt( x * x + y * y ); |
| + | } |
| + | |
| + | // В коде: |
| + | var v = Vector2.create(3.0, 4.0); |
| + | var len = v as real; // => 5.0 |
| + | </source> |
| + | |
| + | |
| + | == Оператор индексного доступа == |
| | | |
− | ÃÂÃÂÃÂáÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂòÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂàÃÂÃÂÃÂôÃÂÃÂÃÂòÃÂÃÂÃÂð ÃÂÃÂÃÂþÃÂÃÂÃÂÿÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂð - <tt>[]</tt> ÃÂÃÂÃÂø <tt>[]=</tt> - ÃÂÃÂÃÂþÃÂÃÂÃÂÿÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂàÃÂÃÂÃÂøÃÂÃÂÃÂýÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂþÃÂÃÂÃÂóÃÂÃÂÃÂþ ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂàÃÂÃÂÃÂø ÃÂÃÂÃÂþÃÂÃÂÃÂÿÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂàÃÂÃÂÃÂøÃÂÃÂÃÂýÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂþÃÂÃÂÃÂù ÃÂÃÂÃÂ÷ÃÂÃÂÃÂðÃÂÃÂÃÂÿÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂø.
| + | Существует два оператора - <tt>[]</tt> и <tt>[]=</tt> - оператор индексного чтения и оператор индексной записи. |
| | | |
− | ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÿÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂàÃÂÃÂÃÂøÃÂÃÂÃÂýÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂþÃÂÃÂÃÂóÃÂÃÂÃÂþ ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂàÃÂÃÂÃÂÿÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂüÃÂÃÂÃÂðÃÂÃÂÃÂõÃÂÃÂÃÂàÃÂÃÂÃÂýÃÂÃÂÃÂõ ÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂõÃÂÃÂÃÂõ ÃÂÃÂÃÂþÃÂÃÂÃÂôÃÂÃÂÃÂýÃÂÃÂÃÂþÃÂÃÂÃÂóÃÂÃÂÃÂþ ÃÂÃÂÃÂÿÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂð (ÃÂÃÂÃÂòÃÂÃÂÃÂþÃÂÃÂÃÂ÷ÃÂÃÂÃÂüÃÂÃÂÃÂþÃÂÃÂÃÂöÃÂÃÂÃÂýÃÂÃÂÃÂþ ÃÂÃÂÃÂñÃÂÃÂÃÂþÃÂÃÂÃÂûÃÂÃÂÃÂõÃÂÃÂÃÂõ ÃÂÃÂÃÂþÃÂÃÂÃÂôÃÂÃÂÃÂýÃÂÃÂÃÂþÃÂÃÂÃÂóÃÂÃÂÃÂþ), ÃÂÃÂÃÂýÃÂÃÂÃÂõ ÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂàÃÂÃÂÃÂþÃÂÃÂÃÂñÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂàÃÂÃÂÃÂø ÃÂÃÂÃÂÿÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ
| + | Оператор индексного чтения принимает не менее одного параметра (возможно более одного), не меняет объект и параметры |
− | ÃÂÃÂÃÂø ÃÂÃÂÃÂôÃÂÃÂÃÂþÃÂÃÂÃÂûÃÂÃÂÃÂöÃÂÃÂÃÂõÃÂÃÂÃÂý ÃÂÃÂÃÂòÃÂÃÂÃÂþÃÂÃÂÃÂ÷ÃÂÃÂÃÂòÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂ÷ÃÂÃÂÃÂýÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂõ - ÃÂÃÂÃÂ÷ÃÂÃÂÃÂýÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂõ ÃÂÃÂÃÂÃÂÃÂÃÂÃÂûÃÂÃÂÃÂõÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂÃÂÃÂÃÂÃÂð ÃÂÃÂÃÂÿÃÂÃÂÃÂþ ÃÂÃÂÃÂÃÂÃÂÃÂÃÂúÃÂÃÂÃÂðÃÂÃÂÃÂ÷ÃÂÃÂÃÂðÃÂÃÂÃÂýÃÂÃÂÃÂýÃÂÃÂÃÂÃÂÃÂÃÂÃÂü ÃÂÃÂÃÂøÃÂÃÂÃÂýÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂü.
| + | и должен возвращать значение - значение элемента по указанным индексам. |
| | | |
− | ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÿÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂàÃÂÃÂÃÂøÃÂÃÂÃÂýÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂþÃÂÃÂÃÂù ÃÂÃÂÃÂ÷ÃÂÃÂÃÂðÃÂÃÂÃÂÿÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂø ÃÂÃÂÃÂÿÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂüÃÂÃÂÃÂðÃÂÃÂÃÂõÃÂÃÂÃÂàÃÂÃÂÃÂýÃÂÃÂÃÂõ ÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂõÃÂÃÂÃÂõ ÃÂÃÂÃÂôÃÂÃÂÃÂòÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ
ÃÂÃÂÃÂÿÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂò. ÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂûÃÂÃÂÃÂõÃÂÃÂÃÂôÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂù ÃÂÃÂÃÂÿÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂòÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂóÃÂÃÂÃÂôÃÂÃÂÃÂð ÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂòÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂòÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂàÃÂÃÂÃÂ÷ÃÂÃÂÃÂýÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂÃÂ, ÃÂÃÂÃÂúÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂõ
| + | Оператор индексной записи принимает не менее двух параметров. Последний параметр всегда соответствует значению, которое |
− | ÃÂÃÂÃÂôÃÂÃÂÃÂþÃÂÃÂÃÂûÃÂÃÂÃÂöÃÂÃÂÃÂýÃÂÃÂÃÂþ ÃÂÃÂÃÂñÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂ÷ÃÂÃÂÃÂðÃÂÃÂÃÂÿÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂýÃÂÃÂÃÂþ. ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÿÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂàÃÂÃÂÃÂøÃÂÃÂÃÂ÷ÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂàÃÂÃÂÃÂþÃÂÃÂÃÂñÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂÃÂ, ÃÂÃÂÃÂýÃÂÃÂÃÂþ ÃÂÃÂÃÂýÃÂÃÂÃÂõ ÃÂÃÂÃÂøÃÂÃÂÃÂ÷ÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂàÃÂÃÂÃÂÃÂÃÂÃÂÃÂòÃÂÃÂÃÂþÃÂÃÂÃÂø ÃÂÃÂÃÂÿÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ.
| + | должно быть записано. Оператор изменяет объект, но не изменяет свои параметры. |
| | | |
− | ÃÂÃÂÃÂÃÂÃÂÃÂÃÂûÃÂÃÂÃÂàÃÂÃÂÃÂôÃÂÃÂÃÂòÃÂÃÂÃÂÃÂÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂþÃÂÃÂÃÂóÃÂÃÂÃÂþ ÃÂÃÂÃÂòÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂð ÃÂÃÂÃÂüÃÂÃÂÃÂþÃÂÃÂÃÂöÃÂÃÂÃÂõÃÂÃÂÃÂàÃÂÃÂÃÂñÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂÃÂÃÂÃÂÃÂôÃÂÃÂÃÂþÃÂÃÂÃÂñÃÂÃÂÃÂýÃÂÃÂÃÂÃÂÃÂÃÂÃÂü ÃÂÃÂÃÂÿÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂøÃÂÃÂÃÂýÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂòÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂúÃÂÃÂÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂôÃÂÃÂÃÂøÃÂÃÂÃÂýÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ. ÃÂÃÂÃÂàÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂü ÃÂÃÂÃÂÃÂÃÂÃÂÃÂûÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂõ ÃÂÃÂÃÂüÃÂÃÂÃÂþÃÂÃÂÃÂöÃÂÃÂÃÂýÃÂÃÂÃÂþ ÃÂÃÂÃÂþÃÂÃÂÃÂÿÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂûÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂÃÂÃÂÃÂÃÂûÃÂÃÂÃÂõÃÂÃÂÃÂôÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂõ ÃÂÃÂÃÂþÃÂÃÂÃÂÿÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ:
| + | Для двумерного вектора может быть удобным проиндексировать координаты. В этом случае можно определить следующие операторы: |
| | | |
| <source lang="kpp"> | | <source lang="kpp"> |
Строка 45: |
Строка 158: |
| } | | } |
| | | |
− | // ÃÂÃÂÃÂàÃÂÃÂÃÂúÃÂÃÂÃÂþÃÂÃÂÃÂôÃÂÃÂÃÂõ: | + | // В коде: |
| var v = Vector2.create(0, 0); | | var v = Vector2.create(0, 0); |
| v[1] = 5; // => (0, 5) | | v[1] = 5; // => (0, 5) |
Строка 52: |
Строка 165: |
| | | |
| | | |
− | == ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÿÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂàÃÂÃÂÃÂòÃÂÃÂÃÂÃÂÃÂÃÂÃÂ÷ÃÂÃÂÃÂþÃÂÃÂÃÂòÃÂÃÂÃÂð ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂúÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂø == | + | == Оператор вызова функции == |
| | | |
− | ÃÂÃÂÃÂáÃÂÃÂÃÂÿÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂðÃÂÃÂÃÂûÃÂÃÂÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂÃÂÃÂÃÂÃÂù ÃÂÃÂÃÂþÃÂÃÂÃÂÿÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂà<tt>call</tt> ÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂûÃÂÃÂÃÂÃÂÃÂÃÂÃÂ÷ÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂôÃÂÃÂÃÂûÃÂÃÂÃÂàÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂóÃÂÃÂÃÂþ, ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂñÃÂÃÂÃÂàÃÂÃÂÃÂþÃÂÃÂÃÂñÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂàÃÂÃÂÃÂüÃÂÃÂÃÂþÃÂÃÂÃÂöÃÂÃÂÃÂýÃÂÃÂÃÂþ ÃÂÃÂÃÂñÃÂÃÂÃÂÃÂÃÂÃÂÃÂûÃÂÃÂÃÂþ ÃÂÃÂÃÂñÃÂÃÂÃÂàÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂûÃÂÃÂÃÂÃÂÃÂÃÂÃÂ÷ÃÂÃÂÃÂþÃÂÃÂÃÂòÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂúÃÂÃÂÃÂðÃÂÃÂÃÂú ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂúÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂÃÂ.
| + | Специальный оператор <tt>call</tt> используется для того, чтобы объект можно было бы использовать как функцию. |
− | ÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂàÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂúÃÂÃÂÃÂðÃÂÃÂÃÂúÃÂÃÂÃÂøÃÂÃÂÃÂÃÂ
ÃÂÃÂÃÂþÃÂÃÂÃÂóÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂù ÃÂÃÂÃÂýÃÂÃÂÃÂð ÃÂÃÂÃÂÿÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂø ÃÂÃÂÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂòÃÂÃÂÃÂõÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂõ ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂóÃÂÃÂÃÂþ ÃÂÃÂÃÂþÃÂÃÂÃÂÿÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂð.
| + | Нет никаких ограничений на параметры и поведение этого оператора. |
| | | |
− | ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂüÃÂÃÂÃÂõÃÂÃÂÃÂÃÂ:
| + | Пример: |
| | | |
| <source lang="kpp"> | | <source lang="kpp"> |
Строка 67: |
Строка 180: |
| } | | } |
| | | |
− | // ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂûÃÂÃÂÃÂÃÂÃÂÃÂÃÂ÷ÃÂÃÂÃÂþÃÂÃÂÃÂòÃÂÃÂÃÂðÃÂÃÂÃÂýÃÂÃÂÃÂøÃÂÃÂÃÂõ: | + | // Использование: |
| var greeting = new GreetingPrinter; | | var greeting = new GreetingPrinter; |
− | greeting("Peter"); // ÃÂÃÂÃÂòÃÂÃÂÃÂÃÂÃÂÃÂÃÂòÃÂÃÂÃÂõÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂà"Hello, Peter!" | + | greeting("Peter"); // выведет "Hello, Peter!" |
| | | |
| function f(const b) | | function f(const b) |
Строка 76: |
Строка 189: |
| } | | } |
| | | |
− | f() { |x| puts("Hi, #{x}!"); }; // ÃÂÃÂÃÂòÃÂÃÂÃÂÃÂÃÂÃÂÃÂòÃÂÃÂÃÂõÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂà"Hi, Vova!" | + | f() { |x| puts("Hi, #{x}!"); }; // выведет "Hi, Vova!" |
− | f(new GreetingPrinter); // ÃÂÃÂÃÂòÃÂÃÂÃÂÃÂÃÂÃÂÃÂòÃÂÃÂÃÂõÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂà"Hello, Vova!" | + | f(new GreetingPrinter); // выведет "Hello, Vova!" |
| </source> | | </source> |
Операторы отличаются от обычных функций тем, что имеют определенные ограничения по количеству
аргументов, а также некоторое ожидаемое поведение. Например, оператор + (сложение), принимающий
более чем один аргумент, выглядел бы глупо. Кроме того, вряд ли кто-то ждет от оператора сложения
изменение объекта, для которого он вызван, или аргумента.
Рассмотрим различные типы операторов более подробно.
Все арифметические операторы, за исключением бираного НЕ, инкремента и декремента, принимают
один параметр. Они не должны менять исходный объект и объект-параметр; результат операции
должен быть возвращен в виде вновь созданного объекта. Таким образом, и оператор и его аргумент
должны быть объявлены константными.
В качестве примера приведем реализацию некоторых операторов для класса двумерного вектора:
Существует 6 операторов сравнения: "меньше", "больше", "меньше или равно", "больше или равно", "равно" и "не равно" -
соответственно, <, >, <=, >=, ==, !=.
Все эти операторы также должны принимать один параметр, не должны изменять объект и параметр, а кроме того, все они
должны возвращать в качестве результата логическое значение - true или false.
Кроме того, каждому арифметическому оператору соответствует оператор присваивания, имя которого составляется из
имени математического оператора плюс символ "=" (например, +=). Такие операторы делают соответствующее
математическое действие с текущим объектом.
Операторы присваивания изменяют текущий объект, но не изменяют аргумент. Все они, кроме ~=, --=
и ++=, принимают ровно один аргумент.
Операторы присваивания должны возвращать текущий объект в качестве результата.
Часто бывает так, что одни и те же объекты могут быть представлены различными способами. Например, число 5 может
быть представлено как целочисленное 5, вещественное 5.0 или в виде строки "5".
Операторы приведения типов позволяют преобразовывать объекты из одних классов в другие.
Имя такого оператора совпадает с именем класса, в который производится преобразование; оператор не принимает
параметров и не должен менять текущий объект.
При объявлении оператора приведения типа, тип результата функции указывать не следует.
Продолжим пример с двумерным вектором. В некоторых задачах бывает целесообразно определить преобразование вектора
в вещественное число, возвращающее длину вектора.
Это можно сделать следующим образом:
// В коде:
var v = Vector2.create(3.0, 4.0);
var len = v as real; // => 5.0
</source>
Оператор индексного чтения принимает не менее одного параметра (возможно более одного), не меняет объект и параметры
и должен возвращать значение - значение элемента по указанным индексам.
Оператор индексной записи принимает не менее двух параметров. Последний параметр всегда соответствует значению, которое
должно быть записано. Оператор изменяет объект, но не изменяет свои параметры.
Для двумерного вектора может быть удобным проиндексировать координаты. В этом случае можно определить следующие операторы:
// В коде:
var v = Vector2.create(0, 0);
v[1] = 5; // => (0, 5)
var r = v[0]; // => 0
</source>
// Использование:
var greeting = new GreetingPrinter;
greeting("Peter"); // выведет "Hello, Peter!"
f() { |x| puts("Hi, #{x}!"); }; // выведет "Hi, Vova!"
f(new GreetingPrinter); // выведет "Hello, Vova!"
</source>