Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 In- och utmatning. 5 Operatoröverlagring. 6 namnrymder (namespace)

Relevanta dokument
Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 Operatoröverlagring. 5 In- och utmatning. 6 namnrymder (namespace)

Innehåll. Pekare Syntax

Innehåll. Användardefinierade typer. Användardefinierade typer Kategorier. Konstruktorer. Konstruktorer Två sätt att skriva initiering av medlemmar

EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Administration. EDAf30: Programmering i C++, 7.5 hp Obligatoriska moment

Innehåll. Pekare Exempel

Innehåll. Pekare Exempel

Innehåll. Resurshantering. Resource handles. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 6. Resurshantering

Innehåll. EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Viktiga skillnader mot Java

Innehåll. Konstruktorer vid arv Regler för basklassens konstruktor. Konstruktorer vid arv. Konstruktorer vid arv. Konstruktorer vid arv

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (casting) Implicita Typomvandlingar

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

TDIU01 - Programmering i C++, grundkurs

C++ - En introduktion

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

TDIU01 - Programmering i C++, grundkurs

Innehåll. 1 Typdeklarationer och typomvandling 2 Resurshantering. 3 Objektorientering, kort repetition. 4 Klasser

TDIU01 Programmering i C++

Innehåll. Resource handles. Resurshantering. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 7. Resurshantering, Felhantering

TDIU01 - Programmering i C++, grundkurs

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Kapitel 5. Strömmar. Utmatning

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

Det finns många flaggor till g++,

Tentamen EDAF30 Programmering i C++

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

TDIU01 (725G67) - Programmering i C++, grundkurs

Programmering i C++ EDA623 Typer. EDA623 (Föreläsning 4) HT / 33

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Tentamen EDAF30 Programmering i C++

Klasser. Kapitel 2. Kapitel 2 - Klasser, medlemmar och arv. Klasser. Klasser Medlemmar Arv

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Tecken. char. char ch = A ; sizeof(char) = 1 byte (ej 16-bitars tecken som i Java) char namn[]= "Nils"; // längd = 5 bytes

Funktionens deklaration

Objektorienterad programmering

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

1 Klasser och objektorientering Vad är objektorientering?

C++-programmets beståndsdelar

Operatoröverlagring. endast operatorsymboler definierade i C++ kan överlagras = += -= *= /= %= ^= &= = <<= >>= < > <= >= ==!= && > ->*, [ ] ( )

grundläggande C++, funktioner m.m.

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

TDDC76 - Programmering och Datastrukturer

Innehåll. Exceptionella händelser (exceptions, undantag ) Felhantering Tre nivåer av felhantering: Nivå 2: exceptions (eller returvärde)

Innehåll. 1 Funktionsmalllar. 2 Klassmallar. struct Name { string s; //... }; const Name & minimum ( const Name & a, const Name & b) { if(a.s < b.

TDIU01 - Programmering i C++, grundkurs

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (type casts) Explicita, namngivna typomvandlingar (C++-11)

int (*fp) (char, char*) //pekare till funktion som tar //argumenten (char, char*) och //returnerar int

Klasser. Det är egentligen nu som kursen i programmeringsteknik börjar..., s k objektorienterad programmering.

TDDC76 - Programmering och Datastrukturer

KLASSER. Inkapsling Abstrakt datatyp Public och private. Klassmedlemmar Datamedlemmar Exempel Funktionsmedlemmar

Innehåll. Parametriserade typer. Klassmallar. Klassmallen Vektor Konstructor med std::initializer_list. Klassmallen Vektor Medlemsfunktioner

*:85/ID200V C++ HT07. Föreläsning 8 Medlemspekare Undantagshantering Namnrymder

1 Namnkontroll (NameControl)

Tentamen *:85/2I4123 C

Programmering i C++ EDA623 Strömmar och filer. EDA623 (Föreläsning 9) HT / 19

Det objektorienterade synsättet. Objekt. Datorprogrammet kan uppfattas som en slags modell av den verklighet programmet skall samverka med.

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Innehåll. 1 Funktionsmallar. 2 Pekare och konstanter. 3 Typomvandlingar. struct Name { string s; //... };

TDDC76 - Programmering och Datastrukturer

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Nedan skapar vi klassen Person innehållande datamedlemmar för förnamn, efternamn, ålder, längd och vikt:

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

Tillämpad programmering

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Del6 Strömmar Ämnesområden denna föreläsning:

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

TDDC76 - Programmering och Datastrukturer

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

TDIU01 - Programmering i C++, grundkurs

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

TDIU01 - Programmering i C++, grundkurs

Föreläsning 5-6 Innehåll

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

C++ Objektorientering - Klasser. Eric Elfving

Java, klasser, objekt (Skansholm: Kapitel 2)

Tommy Färnqvist, IDA, Linköpings universitet

Programmering i C++ EDAF hp. EDAF30 (Föreläsning 2) HT / 18

Synlighet. Namespace Scope-operatorn Klasser Vänner

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

Innehåll. 1 volatile. 2 Kuriositeter. 3 Klasser och arv. 4 Råd och tumregler. 5 Mer om standard-containers. Trigraphs

Objektorienterad programmering i Java

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

Typkonvertering. Java versus C

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

TDDI14 Objektorienterad programmering

TDDC76 - Programmering och Datastrukturer

Innehåll. Pekare. Datatyper Pekare, Arrayer och Referenser. Pekare Syntax. Pekare Syntax, operatorer. 4. Standard-containers. Pekare och arrayer

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Programmering A. Johan Eliasson

Övriga byggstenar. Övriga byggstenar. Några tips under programutveckling. Beroenden Pekare till funktioner Typkonvertering

Transkript:

Innehåll EDAF30 Programmering i C++ 2. Användardefinierade typer Sven Gestegård Robertz Datavetenskap, LTH 2016 1 Deklarationer, scope och livstid 2 Användardefinierade typer 3 Standardbibliotekets alternativ till C-arrayer std::string std::vector 4 In- och utmatning 5 Operatoröverlagring 6 namnrymder (namespace) 2. Användardefinierade typer 2/1 Deklarationer Scope Deklarationer livstid En deklaration inför ett namn i ett scope ( deklarationsområde ): Local scope: Ett namn deklarerat i en funktion syns Från deklarationen Till slutet av blocket (block omges av ) Argument till funktioner är lokala namn Class scope: Ett namn kallas en medlem (member) om det definieras i en klass. Det syns i hela klassen. Namespace scope: Ett namn kallas namespace member om det definieras i ett namespace, utanför någon funktion eller, klass (eller enum class). T ex std::cout. Ett namn deklarerat utanför ovanstående kallas globalt namn och tillhör the global namespace. Ett objekts livstid avgörs av dess scope: måste initialiseras (konstrueras) innan det kan användas förstörs (destrueras) vid slutet av dess scope. namespace-objekt förstörs när programmet avslutas Objekt som allokerats med new lever tills de förstörs med delete. (Skillnad mot Java) Deklarationer, scope och livstid 2. Användardefinierade typer 3/41 Deklarationer, scope och livstid 2. Användardefinierade typer 4/41 Användardefinierade typer Inbyggda typer (t ex char, int, double, pekare,... ) en direkt och effektiv representation av datorns funktionalitet låg abstraktionsnivå Användardefinierade typer abstraktion byggd med de inbyggda typerna struct, class (som class i Java) från standardbiblioteket std::string (liknar java.lang.string) std::vector, std::list... (liknar motsvarande i java.util) enum class: uppräkningstyp (liknar enum i Java) En konkret typ kan användas som en inbyggd typ Första steget i att bygga en ny typ är att organisera dess element i en datastruktur (en struct). : Punkt i 2D struct Point ; En variabel av typen Point kan skapas med men medlemsvariablerna har odefinierade värden. Vi måste initialisera variabeln Användardefinierade typer 2. Användardefinierade typer 5/41 Användardefinierade typer : 2. Användardefinierade typer 6/41

Initialisering En funktion för att initiera en Point: void init_point ( Point & p, int x, int y) p.x = x; p.y = y; En variabel av typen Point, kan då skapas med init_point (p, 10, 20); referensanrop: objektet p ändras Användning Nu kan vi använda vår typ Point: Point read_point () cout << " Enter x coordinate :" << endl ; cin >> x; cout << " Enter y coordinate :" << endl ; cin >> y; init_point (p, x, y); return p; >> är inmatningsoperatorn standardbiblioteket <iostream> std::cin är standard input Användardefinierade typer : 2. Användardefinierade typer 7/41 Användardefinierade typer : 2. Användardefinierade typer 8/41 Användning (2) int square ( int x) return x*x; double distance ( const Point & p1, const Point & p2) return sqrt ( square (p2.x - p1.x) + square (p2.y - p1.y )); void example () Point p1 = read_point (); Point p2 = read_point (); cout << " The distance between points is " << distance (p1,p2) << endl ; Ofta vill man kapsla både data och operationer tillsammans Få en typ att uppföra sig som en inbyggd typ Ofta: göra representationen oåtkomlig för användare En klass har datamedlemmar ( attribut ) medlemsfunktioner ( metoder ) medlemmar kan vara public private protected som i Java Användardefinierade typer : 2. Användardefinierade typer 9/41 Användardefinierade typer : 2. Användardefinierade typer 10/41 class Point Point (int xi =0, int yi =0) :xxi, yyi // konstruktor double distance_to ( const Point &); int get_x () return x; int get_y () return y; private : ; konstruktor, som i Java Skapar ett objekt och initierar medlemmar satserna blir nu Point p(10, 20); init_point (p, 10, 20); NB! p är ett objekt, inte en referens som i Java Default-värden på parametrarna: blir Point p(0,0); alltid initierade medlemsvariabler class Point Point (int xi =0, int yi =0) :xxi, yyi double distance_to ( const Point &); int get_x () return x; int get_y () return y; private : ; double Point :: distance_to (const Point & p) return sqrt ( square (p.x - x) + square (p.y - y)); medlemsfunktion, (metod i Java) deklareras i klassdefinitionen definieras i eller utanför klassdefinitionen Användardefinierade typer : 2. Användardefinierade typer 11/41 Användardefinierade typer : 2. Användardefinierade typer 12/41

Point read_point () cout << " Enter x coordinate :" << endl ; cin >> x; cout << " Enter y coordinate :" << endl ; cin >> y; return Point (x, y); void example () Point p1 = read_point (); Point p2 = read_point (); cout << " The distance between points is " << p1. distance_to (p2) << endl ; NB! return-by-value returnerar (en kopia av) ett Point-objekt inte en Point-referens som i Java Användardefinierade typer : 2. Användardefinierade typer 13/41 Klassdefinitioner Deklarationer och definitioner av medlemsfunktioner Medlemsfunktioner ( metoder i Java) Definition av klass class Foo int fun(int, int ); // Deklaration av medlemsfunktion ; int times_two (int x) return 2*x; //... inkl definition Obs! Semikolon efter klass Definition av medlemsfunktion (utanför klassen) int Foo :: fun(int x, int y) //... Inget semikolon efter funktion Användardefinierade typer : 2. Användardefinierade typer 14/41 Filstruktur för klasser C-stil enum: en mängd namgivna värden Klassdefinitionen läggs i en headerfil (.h eller.hpp) För att inte riskera att definiera en klass mer än en gång används include guards: # ifndef FOO_H # define FOO_H //... class Foo //... ; # endif Medlemsfunktioner läggs i en källkodsfil (.cpp) enum ans JA, NEJ, KANSKE, VET_EJ ; enum colour BLUE=2, RED=3, GREEN=5, WHITE =7; colour fgcol = BLUE ; colour bgcol = WHITE ; ans svar ; fgcol =RED; bgcol = GREEN ; svar = NEJ; fgcol = KANSKE ; // error : cannot convert ans to colour svar = 2; // error : invalid conversion from int to ans bool dumt = ( fgcol == svar ); // Tillåtet, ger kanske en varning int x = fgcol ; // OK, x = 3 Användardefinierade typer : 2. Användardefinierade typer 15/41 Användardefinierade typer : 2. Användardefinierade typer 16/41 C++: enum class A propos namn-läckage Problem med enum Namnen läcker ut i omgivande scope. enum eyes brown, green, blue ; enum traffic_light red, yellow, green ; error: redeclaration of green C++:enum class enum class EyeColour brown, green, blue ; enum class TrafficLight red, yellow, green ; EyeColour e; TrafficLight t; e = EyeColour :: green ; t = TrafficLight :: green ; I stället för using namespace std; är det ofta bättre vara specifik: jfr Java: import java. util.*; import java.util. ArrayList ; Användardefinierade typer : 2. Användardefinierade typer 17/41 Användardefinierade typer : 2. Användardefinierade typer 18/41

Kommentarer Initiering Deklarationer enum class En enum class implementerar alltid initiering, tilldelning och jämförelseoperatorer (t ex == och <) andra operatorer kan implementeras Har ingen implicit konvertering till int enum Värdena är heltal Ha ett värde som betyder fel eller oinitierad. det första värdet, om möjligt initiera alltid variabler, annars blir det odefinierat Använd enum class om möjligt enum alternatives ERROR, ALT1, ALT2 ; enum class alternatives2 ERROR, ALT1, ALT2 ; Variablerna får väldefinierade värden alternatives a; alternatives b ALT1 ; alternatives2 p; alternatives2 q alternatives2 :: ALT1 ; Variablerna kan få vilka värden som helst alternatives x; alternatives2 y; Användardefinierade typer : 2. Användardefinierade typer 19/41 Användardefinierade typer : 2. Användardefinierade typer 20/41 Två typer ur standardbiblioteket Alternativ till C-arrayer Strängar: std::string Använd inte C-arrayer om du inte måste. I stället för char[] Strängar använd std::string T[] Sekvenser använd std::vector<t> Mer likt Java: mer funktionalitet uppför sig som en inbyggd typ skyddsnät std::string har operationer för tilldelning kopiering konkatenering jämförelse in- och utmatning (<< >>) och känner till sin storlek Liknar java.lang.string Standardbibliotekets alternativ till C-arrayer 2. Användardefinierade typer 21/41 Standardbibliotekets alternativ till C-arrayer : std::string 2. Användardefinierade typer 22/41 : std::string Sekvenser: std::vector<t> # include <string > using std :: string ; string make_email ( string fname, string lname, const string & domain ) fname [0] = toupper ( fname [0]); lname [0] = toupper ( lname [0]); return fname +. + lname + @ + domain ; void test_string () string sr = make_email ("sven ", " robertz ", "cs.lth.se"); cout << sr << endl ; Sven. Robertz@cs.lth.se Standardbibliotekets alternativ till C-arrayer : std::string 2. Användardefinierade typer 23/41 En std::vector<t> är en ordnad samling objekt (av samma typ, T) varje element har ett index som, till skillnad från en C-array känner till sin storlek vector<t>::operator[] kollar inte gränser vector<t>::at(size_type) kastar out_of_range kan växa (och krympa) kan tilldelas, jämföras, etc. Liknar java.util.arraylist Är en klassmall (class template) Standardbibliotekets alternativ till C-arrayer : std::vector 2. Användardefinierade typer 24/41

: std::vector<int> initiering : std::vector<int> tilldelning void print_vec (std :: string s, std :: vector <int > v) std :: cout << s << " : " ; for (int e : v) std :: cout << e << " "; std :: cout << std :: endl ; void test_vector_init () std :: vector <int > x (7); print_vec ("x", x); std :: vector <int > y(7,5); print_vec ("y", y); std :: vector <int > z1,2,3; x: 0 0 0 0 0 0 0 y: 5 5 5 5 5 5 5 z: 1 2 3 Standardbibliotekets alternativ till C-arrayer : std::vector 2. Användardefinierade typer 25/41 void test_vector_assign () std :: vector <int > x 1,2,3,4,5; print_vec ("x", x); std :: vector <int > y 10,20,30,40,50; print_vec ("y", y); std :: vector <int > z; z = 1,2,3,4,5,6,7,8,9; z = x; x : 1 2 3 4 5 y : 10 20 30 40 50 z : z : 1 2 3 4 5 6 7 8 9 z : 1 2 3 4 5 Standardbibliotekets alternativ till C-arrayer : std::vector 2. Användardefinierade typer 26/41 : std::vector<int> tilläggning och jämförelse Konsoll-I/O Programexempel void test_vector_eq () std :: vector <int > x 1,2,3; std :: vector <int > y; y. push_back (1); y. push_back (2); y. push_back (3); equal if(x == y) std :: cout << "equal " << std :: endl ; else std :: cout << "not equal " << std :: endl ; In- och utmatning using std :: cin; int main ( ) string namn ; cout << "Vad heter du? "; cin >> namn ; cout << "Goddag, " << namn << "!" << endl ; return 0; Standardbibliotekets alternativ till C-arrayer : std::vector 2. Användardefinierade typer 27/41 In- och utmatning 2. Användardefinierade typer 28/41 Inmatning från standard in std::cin Läs och returnera nästa tecken std :: cin. get () Läs en rad tecken, returnera en std::string std :: string str ; std :: getline (std ::cin,str ); Läs ett antal tecken till C-strängen str char str [ STORLEK ]; // OBS! str må ste vara minst std :: cin. getline (str, STORLEK ); // STORLEK tecken lång Läs nästa tecken och släng det std :: cin. ignore () In- och utmatning 2. Användardefinierade typer 29/41 Inmatning std::getline() fri funktion Exmpel: läs till en std::string using std :: cin; std :: string str; std :: getline (cin, str ); cout << " read a string : " << str << endl ; Exekvering abcdefghijkl read a string : abcdefghijkl std::string ändrar sin storlek så att strängen får plats In- och utmatning 2. Användardefinierade typer 30/41

Inmatning cin.getline() medlemsfunktion i std::istream Exmpel: läs till en char-array constexpr int n = 10; char str [n]; // allokera char - array med längd n std :: cin. getline (str, n); // läs max n -1 std :: cout << "Read : " << str << std :: endl ; Exekvering abcdefghijkl Read : abcdefghi Skriver max n 1 tecken plus null till str tecken In- och utmatning 2. Användardefinierade typer 31/41 Filhantering # include <fstream > Läsa från fil ifstream string ord; f1 >> ord;... f1(" infil.txt"); f1.close(); f1.close(); Ska normalt inte anropas, görs av destruktorn i ifstream Skriva till fil ofstream f2(" utfil.txt"); f2 << namn << " " << telnr << endl ;... f1.close(); f2.close(); In- och utmatning 2. Användardefinierade typer 32/41 Filhantering Läsa/skriva tecken för tecken Operatoröverlagring Läsa oformaterat från fil void print_bytes (std :: string infile ) std :: ifstream in infile ; Operatorer kan överlagras som medlemsfunktioner som fria funktioner int c; while ((c = in.get ())!= EOF ) std :: cout << c << " [" << char (c) << "]\n"; En användardefinierad typ kan användas som en inbyggd typ In- och utmatning 2. Användardefinierade typer 33/41 Operatoröverlagring 2. Användardefinierade typer 34/41 Operatorer Operatorer class Point Point (int xi =0, int yi =0) :xxi, yyi double distance_to ( const Point &); int get_x () return x; int get_y () return y; bool operator ==( const Point & p) return (x == p.x) && (y == p.y); private : ; void example_operators () Point p1 1,2; Point p2 1,2; Point p3 1,3; bool operator!=( Point & p1, Point & p2) return!(p1 == p2 ); Implementera operator!= i termer av operator==. Kan vara fri funktion, operator== är public cout << "p1 == p2: " << (p1 == p2) << endl ; cout << "p1 == p3: " << (p1 == p3) << endl ; Operatoröverlagring 2. Användardefinierade typer 35/41 Operatoröverlagring 2. Användardefinierade typer 36/41

Namnrymder namespace Avgränsa synligheten för namn tydligare vilka funktioner/klasser/konstanter som hör ihop minskar risken för namnkrockar Jfr package i Java Åtkomst av namn i namnrymder fullständigt kvalificerat namn vid användning: namnrymd::namn selektivt med using namnrymd::namn import av alla namn med using namespace namnrymd undvik generellt, eller använd avgränsat skriv aldrig using-direktiv i header-filer Namnrymder kan utökas Utom (med några undantag) std ( undefined behaviour) Namnrymder namespace deklarationer (.h) namespace foo void test (); namespace bar void test (); foo :: test (); bar :: test (); using namespace foo; test (); foo :: test () bar :: test () foo :: test () definitioner (.cpp) namespace foo void test () cout << "foo :: test ()\n"; void bar :: test () cout << "bar :: test ()\n"; namnrymder (namespace) 2. Användardefinierade typer 37/41 namnrymder (namespace) 2. Användardefinierade typer 38/41 Namnrymder namespace Läsanvisningar Den namnlösa namnrymden endast synlig i filen där den deklarerats används för att dölja saker (jfr static i C) Se upp med namkrock med globala namn namespace foo void test () cout << " foo :: test ()\ n"; namespace void test () cout << ":: test ()\ n"; test (); foo :: test (); :: test (); :: test () foo :: test () :: test () Alternativa namn för namnrymder: namespace test=my_namespace_for_testing_stuff; namnrymder (namespace) 2. Användardefinierade typer 39/41 Referenser till relaterade avsnitt i Lippman 2.6, 7.1.4, 7.1.5, 13.1.3 std::string 3.2 std::vector 3.3 19.3 Scope och livstid 2.2.4, 6.1.1 I/O 1.2, 8.1 8.2 Operatoröverlagring 14.1 Sammanfattning 2. Användardefinierade typer 40/41