Elementi di C++



Elementi di C++ con UML, HTML, Java

Corso di Informatica per la Fisica

per studenti del primo anno del Corso Triennale di FISICA

Adele Rimoldi - Dipartimento di Fisica Nucleare e Teorica Università di Pavia, I

Riepilogo del linguaggio C 14

Struttura di un programma in C 14

Il Preprocessore 15

Il main program 17

Commenti 17

Input/Output 17

I/O: lettura e scrittura 18

I/O: principali funzioni I/O da tastiera 18

I/O: scanf() 19

I/O: lettura e scrittura da file 19

Tipi predefiniti in C 20

Identificatori 21

Dichiarazione 21

typedef 22

Enumeratori 23

Operatori 24

Espressioni di assegnazione 25

Statements 26

Statement composti 26

if 26

while e do-while 27

break e continue 27

switch 28

L’operatore ? 28

Array 29

Puntatori 30

& 30

* 31

Puntatore nullo 32

Puntatori e array 32

Puntatori: allocazione dinamica 33

Regole di conversione e cast 34

Funzioni 34

Prototipi delle funzioni 35

Call-by-Value 35

Call-by-Reference 36

Funzioni esterne 37

struct 37

Accesso ai membri delle strutture 39

Passaggio dei membri di una struct a una funzione 39

Passaggio di una intera struttura ad una funzione 40

Puntatori a strutture 40

Dichiarazione di un puntatore ad una struttura 40

Uso dei puntatori a struttura 40

L’operatore -> 40

C++ come C “migliorato” 42

main program 42

Parametri del programma 43

Organizzazione dei files 44

Stringhe 44

Size e capacity 45

Accesso agli elementi di una stringa 45

iostream 46

Manipolatori 47

fstream 48

stringstream 48

commenti 49

const 49

Riferimenti 50

Riferiementi e Puntatori 50

Scope 50

namespace 51

new e delete 52

Regole di conversione e cast 53

Casting in ANSI C++ 53

Funzioni 54

Funzioni inline 54

Argomenti di default 54

Call by reference 55

Overloading 55

Function signature 55

C++ vs. C: le differenze 56

Classi 57

Linguaggio C e struct 57

Problema: il tipo complesso 57

Metodi 58

Metodi const 59

Modificatori 59

L’ esempio: il tipo complesso 60

Classi 61

struct e class: riepilogo 62

L’ esempio: il tipo complesso 62

Costruttori e distruttori 63

L’ esempio: il tipo complesso 64

Inizializzazione 65

Costruttore di default 65

Costruttore di copia 65

Costruttori ad un parametro 67

Distruttore 67

L’ esempio: il tipo complesso 68

Operatori 68

Regole per la ridefinizione degli operatori 69

Un esempio: l’operatore data

dove number è un file di input che contiene l’informazione che dovrebbe essere digitata sulla tastiera. Naturalmente occorre ricordarsi di aggiungere alla fine del file number un carattere in più a significare la raggiunta fine del file.

La redirezione dell’ I/O non è parte dello standard ANSI C, questo significa che si possono trovare sistemi operativi che non la supportano, anche se nella maggior parte dei casi questo non succede.

►►Il linguaggio C++ supporta l’intero sistema di I/O su file del C. Quindi le trasformazioni di codice da C a C++ non richiedono alcuna variazione per quanto riguarda le routine di I/O del programma.

Tipi predefiniti in C

In C sono definiti una serie di tipi numerici che permettono di rappresentare numeri interi, reali e caratteri.

char (un solo byte) viene normalmente usato per rappresentare interi inferiori a 256. Stringhe e numeri complessi sono implementati come tipi derivati. Non esiste un tipo “logico” a significare “vero” o “falso”. Si utilizza generalmente una macro

#define TRUE 1

#define FALSE 0

int intero in singola precisione

long intero in doppia precisione

float reale in singola precisione

double reale in doppia precisione

long double reale in precisione estesa

unsigned int intero senza segno

unsigned double reale senza segno in doppia precisione

char carattere singolo

esempi di costanti:

123 123 0x123 interi costanti,

decimale, ottale, esadecimale

123l 123u interi, long, unsigned

‘A’ ‘1’ ‘\t’ caratteri, tab

3.14f 3.1415 3.1415L float, double, long double

300°-2 .03°2 30°-1 double, notazione

esponenziale

“Nome” stringa costante

costanti carattere:

‘\a’ alert

‘\\’ backslash

‘\b’ backspace

‘\r’ carriage return

‘\”’ double quote

‘\f’ form feed

‘\t’ tab

‘\n’ newline

‘\0’ carattere nullo

‘\’’ single quote

‘\v’ vertical tab

‘\101’ 101 ottale,

‘A’

‘\x041’ esadecimale, ‘A’

stringhe costanti:

“” stringa nulla (‘\0’)

“nome” ‘n’ ‘o’ ‘m’ ‘e’ ‘\0’

“una \”stringa\”” stampa: una “stringa”

“una stringa \ un \ alla fine della linea

su piu‘ linee” per continuare la stringa

Il numero di bit riservati ad ogni tipo dipende dal microprocessore e dal compilatore impiegati. Come si vede anche dalla tabella un carattere è ad esempio contenuto in un byte nella maggior parte dei casi. Le dimensioni di un intero sono generalmente uguali alle dimensioni di una word nell’ambiente di esecuzione del programma. Negli ambienti a 16 bit, come DOS o Windows 3 un intero è di 16 bit, mentre in ambienti come Windows o NT in genere un intero occupa 32 bit.

►►Il linguaggio C++ aggiunge ai tipi definiti bool e wchar che non hanno uguale in C

Identificatori

I nomi delle variabili, delle funzioni, delle etichette e degli altri oggetti definiti dall’utente sono chiamati genericamente identificatori.

Un identificatore è composto da uno o più caratteri. Il primo carattere deve essere una lettera o un underscore (carattere di sottolineatura). I caratteri successivi possono essere lettere, numeri o underscore. Non esiste un limite in lunghezza, anche se alcuni sistemi si limitano a considerare i primi 31 caratteri

►►Il linguaggio C++ supporta qualsiasi lunghezza per un identificatore, fino a 1024 caratteri; quindi se si deve trasformare un programma dal C al C++ occorre controllare questo aspetto

Gli identificatori che iniziano con un doppio underscore o con un underscore e una lettera maiuscola sono riservati ad usi di sistema. Il C e‘ case sensitive!

int Ntries;

double _attempts;

double 2A; /* errore! */

Dichiarazione

Le dichiarazioni associano un significato ad un identificatore. In C ogni variabile deve essere dichiarata per poter essere usata.

La forma generale di una dichiarazione è:

tipo elenco_variabili;

tipo deve essere un tipo di dati valido in C mentre elenco variabili può essere formato da uno o più nomi di identificatori separati da virgole. Inoltre in C il nome della variabile non ha nulla a che fare con il suo tipo.

int i; /* la variabile i */

double max(double r1,double r2); /* la funzione max */

Una dichiarazione è spesso anche una definizione. Per variabili semplici questo consiste nell’associare un valore alla variabile al momento della dichiarazione */

double pi=3.1415926; /* definizione */

double max(double r1, double r2)

{ /* dichiarazione*/

return (r1>r2) ? r1: r2; /*definizione di max*/

}

Le variabili possono essere definite in tre luoghi diversi:

• all’ interno delle funzioni (variabili locali)

• nella definizione dei parametri delle funzioni

• all’esterno delle funzioni

Le variabili locali possono essere usate solo dalle istruzioni che si trovano all’interno del blocco in cui sono dichiarate. Esse quindi NON sono note all’esterno del proprio blocco di codice che inizia e chiude con una coppia di parentesi graffe. La vita delle variabili locali è legata all’esecuzione del blocco di codice in cui sono dichiarate.

Normalmente si dichiarano le variabili locali all’inizio del blocco di codice, cioè subito dopo la parentesi graffa di apertura della funzione e prima di ogni altra istruzione. Si possono tuttavia dichiarare variabili locali in qualunque altro punto del blocco di codice, per esempio dentro un if. Se una variabile è dichiarata al di fuori di qualsiasi funzione (variabile globale) o localmente ad una funzione.

Le variabili globali essendo note all’intero programma possono essere usate quindi ovunque. Esse conservano inoltre il proprio valore per l’intera esecuzione del programma.

double r; /* r è globale, può essere usata da tutte le funzioni definite in questo file */

main()

{

int i=4; /* dichiarazione e definizione */

double h;

r=3;

h=i*r;

}

typedef

L’istruzione typedef viene utilizzata per creare un alias per tipi esistenti, cioè non si crea un nuovo tipo di dati ma si definisce un nuovo nome ad un tipo di dati preesistente.

Questo processo può essere utile per rendere più trasportabili i programmi dipendenti da una macchina.

La forma generale è la seguente:

typedef tipo nuovonome;

questo nuovo nome si aggiunge a quello preesistente senza sostituirlo.

►►Il linguaggio C++ supporta lo stesso tipo di definizione

typedef int INTEGER; /* per i nostalgici del fortran */

typedef int BOOLEAN; /* un tipo logico */

typedef void (*ptr_f)(); /* ptr_f e` un puntatore ad una procedura (subroutine) */

essa NON può essere usato per implementare nuovi tipi, ma solo per definire un alias.

typedef mela frutto; /* compila soltanto se mela e` gia` stata definita */

Enumeratori

enum è il caso più semplice di un tipo definito dall’utente (è assimilabile ad un tipo intero).

Essa è formata da un gruppo di costanti intere dotate di un nome che specificano tutti i valori consentiti per una variabile di tale tipo.

La forma generale delle enumerazioni è la seguente:

enum nome_tipo_enumerativo {elenco enumerazioni} elenco_variabili;

gli esempi sono riportati nei due riquadri sottostanti.

enum Color

{

red, green=10, blue

};

Color screenColor = blue;

Color windorColor = red;

int n = blue; /* valido */

Color c = 1; /* errore */

enum Seme

{

cuori, picche, quadri, fiori

};

Il nome del tipo enumerativo può essere utilizzato per dichiarare variabili di tale tipo. In C la seguente riga

enum coin money;

Dichiara money come una variabile di tipo coin.

►►Il linguaggio C++ semplifica invece la definizione per cui la stessa variabile può essere dichiarata con la seguente forma abbreviata:

coin money;

Il fattore chiave per capire una enumerazione è che ad ognuno dei simboli corrisponde un valore intero.

Questi valori possono quindi essere utilizzati in qualunque punto si potrebbe utilizzare un intero. Ad ogni simbolo viene assegnato un valore maggiore di una unità rispetto al simbolo precedente. Il valore del primo simbolo dell’enumerazione è 0.

Quindi:

printf(“%d %d”, cuori, quadri);

visualizza i valori 0 e 2.

I valori di uno o più simboli possono essere esplicitati tramite un inizializzatore. Nell’esempio precedente green è posto a 10. inoltre va ricordato che cuori è il nome di un intero, non di una stringa.

Operatori

Esistono quattro classi principali di operatori in C

►►Il linguaggio C++ si comporta in ugual modo per quanto riguarda gli operatori.

Espressioni aritmetiche

-i +w piu` e meno unari

a*b a/b i%2 moltiplicazione,

divisione, modulo

a+b a-b addizione e

sottrazione binarie

a=3; assegnazione

auto-incremento esperessione

e decremento

k = ++j; j=j+1; k=j;

k = j++; k=j; j=j+1;

k = --j; j=j-1; k=j;

k = j--; k=j; j=j-1;

Gli operatori di incremento e di decremento si comportano diversamente a seconda che l’operatore preceda o segua l’operando.

Se l’operatore precede l’ operando il C esegue l’incremento o il decremento prima di fornire il valore dell’operando all’espressione.

Se invece l’operatore segue il C fornisce il valore dell’operando e poi lo incrementa o decrementa.

x=10;

y= ++x;

assegna ad y il valore 11

x=10;

y= x++;

a y viene assegnato il valore 10.

operatori relazionali

< minore di .LT.

> maggiore di .GT.

= maggiore o uguale .GE.

== uguale .EQ.

!= diverso .NE.

! Negazione unaria .NOT.

&& and logico .AND.

|| or logico .OR.

bit-wise

~i; Complemento bit a bit

i&j; AND bit a bit

i|j OR bit a bit

i^j XOR bit a bit

in shift a destra di n pos.

Espressioni di assegnazione

Le espressioni di assegnazione sono valutate da destra a sinistra

a = j++;

j viene assegnato ad a ed in seguito incrementato

Le assegnazioni multiple sono permesse

a = b = c = d = 100;

alcuni operatori di assegnazione combinano assegnazione ed altri operatori.

a *= b; /* equivale ad a = a*b; */

a -= b; /* equivale ad a = a-b; */

Assegnazioni possono essere fatte all’interno di espressioni aritmetiche

a = b + ( c = 3 ); /* equivale a c=3; a=b+c; */

Statements

Le tabelle seguenti indicano una sintesi di statement comuni a partire dal più semplice (quello vuoto costituito solo dal carattere finale di linea (;) agli altri più articolati.

vuoto ;

espressione j=j+k;

composto { . . . . } usato in funzioni, if.. Costituisce un blocco

goto goto label; da non usarsi

if if (p==0)

cerr ................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download