Svmmarivm
Haec lectio considerat qvibvs viis data in fvnctionem intrent et eventvs eivs exeant. Nisi aliter statvitvr, C++ argvmenta per valorem transmittit: parametrvm est exemplvm, et nihil eorvm qvae fvnctio ei facit ad originale pervenit. Referentia contra est altervm nomen cellae qvae iam exsistit, et fvnctioni permittit vt variabilem vocantis mvtet; referentia constans permittit vt datvm magnvm legatvr sine exemplo et sine facvltate id mvtandi. Ad plvres eventvs reddendos bibliotheca praebet std::pair et std::tuple, qvae ligatvris strvctvratis accipivntvr. Seqvvntvr ambitvs nominis (vbi videatvr) et dvratio variabilis (qvando exsistat), cvm obvmbratione nominis et variabilibvs localibvs static, et lectionem clavdit referentia qvae variabili svae svperest. Notio qvae omnia conivngit est flvxvs datorvm inter membra programmatis: exscribere an commvnicare, et visibilitas nominvm vt instrvmentvm segregationis.
Proposita discendi
- Praedicere qvem effectvm fvnctio in argvmenta sva habeat, provt per valorem an per referentiam transmittantvr.
- Modvm transmissionis cvivsqve parametri eligere (valorem pro generibvs parvis, referentiam constantem pro datis magnis, referentiam pro eo qvod mvtatvr) et electionem ivstificare.
- Plvres eventvs per
std::pairvelstd::tuplereddere eosqve ligatvris strvctvratis accipere. - Ambitvm et dvrationem cvivsqve variabilis programmatis definire, inclvsis variabilibvs localibvs
staticet iis qvas alia obvmbrat. - Referentiam ad variabilem localem vel ad valorem temporarivm qvi iam non exsistit agnoscere, cvm monito compilatoris qvod eam nvntiat, eamqve corrigere.
Transmissio per valorem
Parametrvm est exemplvm
Lectio Fvnctiones ostendit qvamqve vocationem qvadrvm in acervo creare, cvm parametris et variabilibvs localibvs fvnctionis, et qvadrvm in reditv evanescere. Restat vt definiatvr qvae ratio intersit inter parametrvm et argvmentvm qvod id initialiset. Responsio qvam C++ nisi aliter statvitvr dat simplicissima est: parametrvm est nova variabilis localis, qvae exemplo valoris argvmenti initialisatvr. Si ita est, fvnctio qvae parametra sva mvtat exempla sva mvtat, et variabiles vocantis non mvtantvr. Programma seqvens id experitvr fvnctione qvae dvos integros permvtare conatvr.
#include <print>// Conatvr a et b permvtare; sola eorvm exempla permvtat.void swapValues(int a, int b){ const int saved{a}; a = b; b = saved; std::println("Intvs: a = {}, b = {}", a, b);}int main(){ int x{1}; int y{2}; swapValues(x, y); std::println("Postea: x = {}, y = {}", x, y);}Intvs: a = 2, b = 1Postea: x = 1, y = 2Intra fvnctionem permvtatio recte fit; post vocationem x et y valores svos servant. Compilator non monet, qvia nihil est de qvo moneat: codex dvas variabiles locales permvtat qvae in fine evanescvnt. Figvra qvadra acervi per vocationem seqvitvr.
Qvadrvm fvnctionis main continet x et y; vocatio svpra id qvadrvm fvnctionis swapValues creat, cvm cellis propriis.
Demonstratio
Ante vocationem qvadrvm fvnctionis
maindvas cellas habet:xcvm 1 etycvm 2.Vocatio qvadrvm fvnctionis
swapValuescreat. Eivs parametraaetbsvnt cellae novae, et in eas valores argvmentorvm exscribvntvr: 1 et 2. Ab hoc momento nvllvm vincvlvm interaetxmanet, nisi qvod eodem valore incepervnt.Variabilis localis
savedin eodem qvadro creatvr et exemplvm ipsivsaservat.Dvae assignationes
aetbpermvtant. Cellae qvae mvtantvr omnes in qvadro svperiore svnt; cellae fvnctionismainnon tangvntvr.In reditv qvadrvm fvnctionis
swapValuestotvm evanescit, cvm permvtatione qvam continebat.xetyadhvc valent 1 et 2.
Qvid exemplvm tveatvr
Transmissio per valorem non est vitivm, sed regvla qvae fvnctiones rationabiles reddit. Primvm, argvmentvm potest esse qvaelibet expressio, non tantvm variabilis: swapValues(x + 1, 7) valida est, qvia parametrvm valore initialisatvr, vndecvmqve venit. Deinde vocans ex declaratione, corpore non lecto, scit variabiles svas non mvtatvm iri. Postremo, intra fvnctionem parametrvm est vna plvs variabilis localis, qvae vt variabilis laboris sine conseqventiis extra adhiberi potest.
#include <print>// Nvmervs cifrarvm decimalivm ipsivs n.// Praecondicio: n >= 0.// Postcondicio: reddit nvmervm cifrarvm ipsivs n (1 pro 0).int digitCount(int n){ int count{1}; while (n >= 10) { n = n / 10; ++count; } return count;}int main(){ const int population{48'210}; std::println("{} habet {} cifras", population, digitCount(population));}48210 habet 5 cifrasFvnctio parametrvm svvm destrvit, id per 10 dividens donec vnam tantvm cifram habeat; cvm exemplvm sit, population intacta manet et const esse potest. Ex eo seqvitvr regvla legendi qvae in toto cvrsv valet: si parametrvm signvm & non habet, qvod in sectione seqventi tractatvr, fvnctio variabilem vocantis mvtare non potest, qvidqvid cvm eo agit.
Argvmentvm oneratvr…