Типы операторов
ÐпеÑаÑоÑÑ Ð¾ÑлиÑаÑÑÑÑ Ð¾Ñ Ð¾Ð±ÑÑнÑÑ ÑÑнкÑий Ñем, ÑÑо имеÑÑ Ð¾Ð¿ÑеделеннÑе огÑаниÑÐµÐ½Ð¸Ñ Ð¿Ð¾ колиÑеÑÑÐ²Ñ Ð°ÑгÑменÑов, а Ñакже некоÑоÑое ожидаемое поведение. ÐапÑимеÑ, опеÑаÑÐ¾Ñ + (Ñложение), пÑинимаÑÑий более Ñем один аÑгÑменÑ, вÑглÑдел Ð±Ñ Ð³Ð»Ñпо. ÐÑоме Ñого, вÑÑд ли кÑо-Ñо Ð¶Ð´ÐµÑ Ð¾Ñ Ð¾Ð¿ÐµÑаÑоÑа ÑÐ»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ обÑекÑа, Ð´Ð»Ñ ÐºÐ¾ÑоÑого он вÑзван, или аÑгÑменÑа.
РаÑÑмоÑÑим ÑазлиÑнÑе ÑÐ¸Ð¿Ñ Ð¾Ð¿ÐµÑаÑоÑов более подÑобно.
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[[,
Содержание |
ÐпеÑаÑоÑÑ Ð¿ÑиÑваиваниÑ
ÐпеÑаÑÐ¾Ñ Ð¿ÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ = - ÑÑо опеÑаÑоÑ, коÑоÑÑй копиÑÑÐµÑ Ð·Ð½Ð°Ñение Ñвоего аÑгÑменÑа в ÑекÑÑий обÑекÑ.
ÐÑоме Ñого, ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð°ÑиÑмеÑиÑеÑÐºÐ¾Ð¼Ñ Ð¾Ð¿ÐµÑаÑоÑÑ ÑооÑвеÑÑÑвÑÐµÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð¿ÑиÑваиваниÑ, Ð¸Ð¼Ñ ÐºÐ¾ÑоÑого ÑоÑÑавлÑеÑÑÑ Ð¸Ð· имени маÑемаÑиÑеÑкого опеÑаÑоÑа плÑÑ Ñимвол "=" (напÑимеÑ, +=). Такие опеÑаÑоÑÑ Ð´ÐµÐ»Ð°ÑÑ ÑооÑвеÑÑÑвÑÑÑее маÑемаÑиÑеÑкое дейÑÑвие Ñ ÑекÑÑим обÑекÑом.
ÐпеÑаÑоÑÑ Ð¿ÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ ÑекÑÑий обÑекÑ, но не изменÑÑÑ Ð°ÑгÑменÑ. ÐÑе они, кÑоме ~=, --= и ++=, пÑинимаÑÑ Ñовно один аÑгÑменÑ.
ÐпеÑаÑоÑÑ Ð¿ÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ ÑекÑÑий обÑÐµÐºÑ Ð² каÑеÑÑве ÑезÑлÑÑаÑа.
ÐпеÑаÑоÑÑ --= и ++= ÑооÑвеÑÑÑвÑÑÑ Ð¿ÑеÑикÑÐ½Ð¾Ð¼Ñ Ð¸Ð½ÐºÑеменÑÑ Ð¸ декÑеменÑÑ.
ÐÐ»Ñ Ñого же клаÑÑа Vector2 из пÑедÑдÑÑего пÑимеÑа:
<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>
ÐпеÑаÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐºÑного доÑÑÑпа
СÑÑеÑÑвÑÐµÑ Ð´Ð²Ð° опеÑаÑоÑа - [] и []= - опеÑаÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐºÑного ÑÑÐµÐ½Ð¸Ñ Ð¸ опеÑаÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐºÑной запиÑи.
ÐпеÑаÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐºÑного ÑÑÐµÐ½Ð¸Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð½Ðµ менее одного паÑамеÑÑа (возможно более одного), не менÑÐµÑ Ð¾Ð±ÑÐµÐºÑ Ð¸ паÑамеÑÑÑ Ð¸ должен возвÑаÑаÑÑ Ð·Ð½Ð°Ñение - знаÑение ÑлеменÑа по ÑказаннÑм индекÑам.
ÐпеÑаÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐºÑной запиÑи пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð½Ðµ менее двÑÑ Ð¿Ð°ÑамеÑÑов. ÐоÑледний паÑамеÑÑ Ð²Ñегда ÑооÑвеÑÑÑвÑÐµÑ Ð·Ð½Ð°ÑениÑ, коÑоÑое должно бÑÑÑ Ð·Ð°Ð¿Ð¸Ñано. ÐпеÑаÑÐ¾Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÐµÑ Ð¾Ð±ÑекÑ, но не изменÑÐµÑ Ñвои паÑамеÑÑÑ.
ÐÐ»Ñ Ð´Ð²ÑмеÑного векÑоÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑдобнÑм пÑоиндекÑиÑоваÑÑ ÐºÐ¾Ð¾ÑдинаÑÑ. Ð ÑÑом ÑлÑÑае можно опÑеделиÑÑ ÑледÑÑÑие опеÑаÑоÑÑ:
<source lang="kpp">
const operator real [] (const int idx) { switch(idx) { case 0: return x; case 1: return y; default: throw ERangeError.create('index is out of range'); } }
const operator Vector2 []= (const int idx, const real value) { switch(idx) { case 0: x = value; case 1: y = value; default: throw ERangeError.create('index is out of range'); } }
// Ркоде: var v = Vector2.create(0, 0); v[1] = 5; // => (0, 5) var r = v[0]; // => 0 </source>
ÐпеÑаÑÐ¾Ñ Ð²Ñзова ÑÑнкÑии
СпеÑиалÑнÑй опеÑаÑÐ¾Ñ call иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¾Ð±ÑÐµÐºÑ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло Ð±Ñ Ð¸ÑполÑзоваÑÑ ÐºÐ°Ðº ÑÑнкÑиÑ. ÐÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð¾Ð³ÑаниÑений на паÑамеÑÑÑ Ð¸ поведение ÑÑого опеÑаÑоÑа.
ÐÑимеÑ:
<source lang="kpp"> class GreetingPrinter {
public operator call (const string who) { puts("Hello, #{who}!"); }
}
// ÐÑполÑзование: var greeting = new GreetingPrinter; greeting("Peter"); // вÑÐ²ÐµÐ´ÐµÑ "Hello, Peter!"
function f(const b) {
b("Vova");
}
f() { |x| puts("Hi, #{x}!"); }; // вÑÐ²ÐµÐ´ÐµÑ "Hi, Vova!" f(new GreetingPrinter); // вÑÐ²ÐµÐ´ÐµÑ "Hello, Vova!" </source>