C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

Samankaltaiset tiedostot
C++11 Seminaari Syntaksi part 1. Veli-Pekka Eloranta

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Metaohjelmointia ja muuta hauskaa

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö.

Demo 6 vastauksia. 1. tehtävä. #ifndef #define D6T1 H D6T1 H. #include <iostream> using std::ostream; using std::cout; using std::endl;

C++11 lambdat: [](){} Matti Rintala

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

\+jokin merkki tarkoittaa erikoismerkkiä; \n = uusi rivi.

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

Virtuaalifunktiot ja polymorfismi

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

ITKP102 Ohjelmointi 1 (6 op)

13 Operaattoreiden ylimäärittelyjä

C++-tyyliopas Tampereen teknillinen yliopisto, Ohjelmistotekniikka, 2005

12 Mallit (Templates)

9. Periytyminen Javassa 9.1

Mallit standardi mallikirjasto parametroitu tyyppi

Periytyminen. Luokat ja olio-ohjelmointi

Ohjelman virheet ja poikkeusten käsittely

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Groovy. Niko Jäntti Jesper Haapalinna Group 31

Apuja ohjelmointiin» Yleisiä virheitä

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Funktiomallit Funktiomallin määrittely

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Kääntäjän virheilmoituksia

9. Periytyminen Javassa 9.1

T Olio-ohjelmointi Osa 3: Luokka, muodostin ja hajotin, this-osoitin Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

Operaattoreiden uudelleenmäärittely

C# olio-ohjelmointi perusopas

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Vakiokokoiset kokonaislukutyypit

Metodien tekeminen Javalla

Tietueet. Tietueiden määrittely

Olio-ohjelmointi Syntaksikokoelma

TIE Ohjelmistojen suunnittelu. Kopiointia ja sijoittelua

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Olio-ohjelmointi Geneerisyys. 1. Johdanto

15. Ohjelmoinnin tekniikkaa 15.1

812336A C++ -kielen perusteet,

Rajapinta (interface)

Groovy. Samuli Haverinen, Aki Hänninen. 19. marraskuuta 2015

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. I Johdanto ohjelmointiin C++kielellä

Sisältö. 2. Taulukot. Yleistä. Yleistä

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VII Suunnittelumallit Adapter ja Composite

Java-kielen perusteet

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia.

4. Luokan testaus ja käyttö olion kautta 4.1

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. V Geneerisyys

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

14. oppitunti. Operaattorin ylikuormitus. Osa. Operaattorin ylikuormittaminen

ITKP102 Ohjelmointi 1 (6 op)

VIII. Osa. Liitteet. Liitteet Suoritusjärjestys Varatut sanat Binääri- ja heksamuoto

Sisältö. 22. Taulukot. Yleistä. Yleistä

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Operaattorin ylikuormitus ja käyttäjän muunnokset

Javan perusteita. Janne Käki

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

1. Omat operaatiot 1.1

15. Ohjelmoinnin tekniikkaa 15.1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet

ITKP102 Ohjelmointi 1 (6 op)

OHJ-1450 Olio-ohjelmoinnin jatkokurssi lisämateriaalia

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

Taulukot. Jukka Harju, Jukka Juslin

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Tehtävä 1. TL5302 Olio-ohjelmointi Koe Malliratkaisuja. Tässä sekä a)- että b)-kohdan toimiva ratkaisu:

Osa III. Olioiden luominen vapaalle muistialueelle

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009

1. Esittelyt ja vakiot 1.1 Esittelyt (declarations) Ennen nimen, tunnuksen (identifier) käyttöä se on

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

815338A Ohjelmointikielten periaatteet

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

Ohjelmointiharjoituksia Arduino-ympäristössä

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Muodostinfunktiot, tuhoajafunktiot ja sijoitusoperaattorit

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

Standardi mallikirjasto

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

TIE Ohjelmistojen suunnittelu. Kopiointia ja sijoittelua

sama tyyppi (joka vastaa kaikkien mahdollisten arvojen summa-aluetta). Esimerkiksi

Osoittimet ja taulukot

Luokat ja funktiot: suunnittelu ja esittely

12. Monimuotoisuus 12.1

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

19. Olio-ohjelmointia Javalla 19.1

Lyhyt kertaus osoittimista

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Transkriptio:

1 C++11 Syntaksi Jari-Pekka Voutilainen 13.4.2012

2 Range-for Iteroi säiliön kaikki alkiot for-silmukassa. Säiliöltä vaaditaan begin- ja end-iteraattorit. Pätee kaikille C++11 STL-säiliöille, taulukoille, alustuslistoille, säännöllisten lausekkeiden tuloksille ja kaikille käyttäjän määrittämille tyypeille, jotka toteuttavat begin- ja end-iteraattorit. int array[5] = { 1, 2, 3, 4, 5; for ( int i: array) { std::cout << i << std::endl;

3 Static_assert Käännösaikaiset testit Vrt. assert, joka testattiin ajon aikana. Voidaan toteuttaa eri näkyvyysalueilla. Globaali / nimiavaruus Luokka Funktio static_assert(sizeof(void*)!= sizeof(long), "Pointers and longs are same sizes." );

4 Constexpr Mahdollistaa lausekkeen evaluoinnin vakioksi käännösaikana. constexpr int x = std::numeric_limits<int>::max(); int array[x]; std::cout << sizeof(array)/sizeof(*array) << std::endl; Vrt. vanha, joka kaatuu koska käännösaikana ei tiedetä taulukon kokoa. const int x = std::numeric_limits<int>::max(); int array[x]; std::cout << sizeof(array)/sizeof(*array) << std::endl;

5 Constexpr Constant expressionin käyttäminen funktioissa asettaa rajoituksia Vain yksi return-lause ja pitää palauttaa jotain muuta kuin void. Saa kutsua vain constexpr-funktioita. Saa viitata vain globaaleihin muuttujiin, jotka myös ovat constexpr. Constexpr-funktiota voidaan kutsua ajon aikana, jos funktion parametrit eivät ole vakiota. constexpr factorial (int n) { return n > 0? n * factorial( n - 1 ) : 1; int n; cin >> n; factorial(n) Constexpr-funktiot ja muuttujat ovat vakioita, mutta vakiot eivät ole constexpr.

6 Omat literaalit C++03:ssa on valmiiksi määritettyjä literaaleja 12.5 tulkitaan kääntäjän toimesta doubleksi 12.5f tulkitaan floatiksi C++11 mahdollistaa uusien literaalien määrittämisen OutputType operator "" _suffix(const char *literal_string); OutputType some_variable = 1234_suffix; OutputType operator "" _suffix(unsigned long long); OutputType operator "" _suffix(long double); OutputType some_variable = 1234_suffix; OutputType another_variable = 3.1416_suffix;

7 Luokan jäsenfunktiot Uusia määreitä luokan jäsenfunktioiden määrittelyyn Eksplisiittisesti määritetyt oletustoteutukset. class Widget{ Widget() = default; Eksplisiittisesti poistetut funktiot. Poistettuja funktioita ei voi kutsua eikä niihin voi viitata. Yleisin käyttökohde on kopioinnin esto. class Widget{ Widget(const Widget&) = delete; Widget& operator=(const Widget&) = delete;

8 Luokan jäsenfunktiot Jäsenfunktioiden periyttämiseen uudet override ja final. Override eksplisiittisesti määrittää, että kantaluokan funktio pitää ylikirjoittaa. Jos kantaluokasta ei löydy samaa funktiota, kääntäjä antaa virheen. class Base{ virtual void some_func(float); virtual int another_func(); class Derived{ virtual void some_func(float) override; virtual void another_func() override; Final estää kantaluokan funktion ylikirjoittamisen periytetyssä luokassa. //ok //kääntäjä antaa virheen class Base{ virtual void some_func(float); virtual int another_func() final; class Derived{ virtual void some_func(float) override; virtual int another_func() override; //ok //kääntäjä antaa virheen

9 Rakentajat Delegoidut ja periytetyt rakentajat Delegoidulla rakentajalla voidaan kutsua kantaluokan rakentajia suoraan. class SomeType { int number; private: void Construct(int new_number) { number = new_number; SomeType(int new_number) { Construct(new_number); SomeType() { Construct(42); ; vrt. class SomeType { int number; SomeType(int new_number) : number(new_number) { SomeType() : SomeType(42) { ; Rakentaja, joka delegoi toiselle rakentajalle, ei voi tehdä mitään muuta alustuslistassaan. Delegoivan rakentajan koodilohko ajetaan, kun palataan delegoidusta rakentajasta.

10 Rakentajat Using-sanalla voidaan käyttää kantaluokan rakentajia class Base{ Base(int); class Derived{ using Base::Base; Derived foo(10); // kutsuu kantaluokan rakentajaa Jos periytetty luokka määrittelee samanlaisen rakentajan kuin kantaluokka, kantaluokan rakentajaa ei periytetä. Lopullisen koodin pitää olla laillista. class Base{ private: Base(int); class Derived{ using Base:Base; Derived bar(10); //virhe, kutsuu Derived(int), joka kutsuu Base(int), joka on privaatti. Virhe huomataan oliota luotaessa.

11 Rakentajat Periytetyn luokan jäsenmuuttujat jäävät alustamatta. Ongelmaa voidaan vähentää oletusarvoilla. class base{ Base(int); class Derived{ using Base::Base; private: int x = 0; int y = 0;

12 Using Using-sanan käyttö laajempaa. Template aliaksina: template <typename T> using MyAllocVec = std::vector<t, MyAllocator>; MyAllocVec<int> v; // std::vector<int, MyAllocator> template<std::size_t N> using StringArray = std::array<std::string, N>; StringArray<15> sa; //std::array<std::string, 15> Tyyppi aliaksina typedef std::unordered_set<int> inthash; using inthash = std::unordered_set<int>; typedef void (*CallBackPtr)(int); using CallBackPtr = void(*)(int);

13 Attribuutit Metatietoja kääntäjälle. C++11 määrittelee kaksi attribuuttia: noreturn ja carries_dependency Noreturn kertoo kääntäjälle että funktio, johon attribuutti on liitetty, ei koskaan palaa. [[noreturn]] void somefunction() { throw "error"; Carries_dependency kertoo kääntäjälle, että kyseisen funktion tai parametrin muistinkäyttöä voi optimoida säikeiden välillä. [[carries_dependency]] int *foo(); void bar( [[carries_dependency]] int *f );

14 Eksplisiittiset tyyppimuunnokset C++11 mahdollistaa tyyppimuunnoksen määrittämisen eksplisiittiseksi. struct A { //implisiittinen muunnos int:ksi operator int() { return 100; //eksplisiittinen muunnos string:ksi explicit operator std::string() { return explicit ; ; int main() { A a; int i = a; // ok, implisiittinen muunnos std::string s = a; //error, vaatii eksplisiittisen muunnoksen std::string se = static_cast<std::string>(a); // ok, eksplisiittinen muunnos

15 Inline namespace Inline namespace mahdollistaa versioinnin nimiavaruuden sisällä. Inlinellä merkitty nimiavarauus sisällytetään ylempään nimiavaruuteen. namespace Networking { namespace V1 { class TCPSocket; inline namespace V2 { class TCPSocket; Networking::TCPSocket *t; Networking::V1::TCPSocket *t2; Networking::V2::TCPSocket *t3; using namespace Networking; TCPSocket *t4 V1::TCPSocket *t5 V2::TCPSocket *t6 // Networking::V2::TCPSocket // Networking::V1::TCPSocket // Networking::V2::TCPSocket // Networking::V2::TCPSocket // Networking::V1::TCPSocket // Networking::V2::TCPSocket class UDPSocket; Useampi inline namespace aiheuttaa konflikteja, jos kyseisissä nimiavaruuksissa on saman nimisiä muuttujia.