ESTRUTURAS
ESTRUTURAS
• Cada estrutura (struct) cria um novo tipo
• Dois tipos estruturas de nomes distintos s˜ao diferentes mesmo quando tˆem exatamente os mesmos membros
• Os componentes de uma struct podem ser p´ublicos, privados ou protegidos
ESTRUTURAS
ESTRUTURAS COM FUNC¸ ˜AO INLINE
struct Date {
int month, day, year;
void display(){ // fun¸c~ao inline
cout << day <<" "<< month <<" "<< year <<" "<< era << "\n"; }
char era; };
int main(int argc, char *argv[]){ Date data = {5, 19, 1948, ’A’}; data.display();
}
Sa´ıda: 19 5 1948 A
c++/rsb 3
ESTRUTURAS COM FUNC¸ ˜AO N ˜AO-INLINE
struct Date {
int month, day, year; void display();
char era; };
void Date::display(){
cout << day <<" "<< month <<" "<< year <<" "<< era << "\n" ; }
int main(int argc, char *argv[]){ Date data = {5, 19, 1948, ’A’}; data.display();
}
ESTRUTURAS
INICIAC¸ ˜AO DE ESTRUTURAS
struct Date {
int month, day, year; void display(){
cout << day <<" "<< month <<" "<< year <<" "<< era << "\n" ; }
private:
char era; };
int main(int argc, char *argv[]){ Date data = {5, 19, 1948, ’A’}; data.display();
}
• Mensagem do compilador: ‘data’ must be initialized by constructor, not by ‘...’
c++/rsb 5
ESTRUTURAS COM CONSTRUTORA
struct Date {
int month, day, year;
Date(int m,int d,int y,char e){month=m;day=d;year=y;era=e;}; void display(){
cout << day <<" "<< month <<" "<< year <<" "<< era << "\n" ; }
private:
char era; };
int main(int argc, char *argv[]){ Date data(5, 19, 1948, ’A’); data.display();
CLASSES
CLASSES
• Uma classe consiste em uma estrutura de dados com habilidade para ocultar alguns de seus componentes e membros fun¸c˜oes para
manipular esta estrutura
• Classes servem para definir novos tipos abstratos de dados • Defini¸c˜ao de classes ´e um um molde para fazer objetos
• Membros da classe podem ser: membros de dados, fun¸c˜oes
construtoras, fun¸c˜oes destruidoras e membros fun¸c˜oes (m´etodos) • As opera¸c˜oes da classe s˜ao definidas por membros que s˜ao fun¸c˜oes • Estruturas (struct) s˜ao classes em que membros sem especifica¸c˜ao
de visibilidade s˜ao p´ublicos:
CLASSES
VISIBILIDADE DOS MEMBROS
• Uma declara¸c˜ao de classe pode conter membros privados (private), protegidos (protected) e p´ublicos (public)
• private: membros declarados como privados somente s˜ao acess´ıveis aos membros funcionais da classe
• public: membros declarados como p´ublicos tˆem a mesma regra de escopo de membros de struct e podem ser referenciados via
qualifica¸c˜ao.
• Membros publics definem a interface da classe
• protected: membros protegidos s˜ao membros privados que s˜ao access´ıveis nas subclasses
• No corpo de fun¸c˜oes membros, todos os membros da classe podem ser referenciados diretamente, sem necessidade de qualifica¸c˜ao
c++/rsb 9
DEFINIC¸ ˜AO DE UMA CLASSE
class Box{ private:
int h, w, d; public:
Box(int, int, int);
void set(int, int, int); int volume(void);
};
Box::Box(int ht, int wd, int dp) { h = ht; w = wd; d = dp;
}
CLASSES
APLICAC¸ ˜AO DA CLASSE Box
int main(){
// declara um cubo
Box thisBox(4, 5, 2);
Box* otherBox = new Box(1, 2, 3); // calculo & exibicao de volume
cout << thisBox.volume() << " " << otherBox->volume(); return 0;
}
c++/rsb 11
DECLARAC¸ ˜AO DE OBJETOS
• No momento da declara¸c˜ao dos objetos, mem´oria para os membros ´
e alocada, e a fun¸c˜ao construtora ´e chamada.
• A declara¸c˜ao de objetos pode ter parˆametros de inicializa¸c˜ao, e.g.: – Box thisBox(7, 8, 9) ;
– Box otherBox = Box(7, 8, 9);
CLASSES
PALAVRA CHAVE this
class Box{
int h, w, d; public:
Box(int, int, int);
void set(int, int, int); int volume(void);
};
Box::Box(int ht, int wd, int dp) {
this->h = ht; this->w = wd; this-> = dp; }
int Box::set(int a,int b,int c){this->h=a;this->w=b;this->d=c;} int Box::volume(){
return this->h * this->w * this->d; }
c++/rsb 13
APONTADOR this
• this ´e um apontador especial que existe em toda fun¸c˜ao n˜ao-est´atica membro de classe
• this aponta para o objeto para o qual a funcao membro est´a sendo executada
• this ´e um parˆametro formal que sempre corresponde ao objeto corrente
• Quando uma fun¸c˜ao membro ´e chamada, this recebe automaticamente o endere¸co do objeto correspondente
• Toda referˆencia a membro de dados feita a partir de uma fun¸c˜ao membro usa implicitamente o operador this
CLASSES
IMPLEMENTAC¸ ˜AO DO this
• this tem tipo X*, onde X ´e a classe correspondente • this n˜ao pode ser modificado
• A fun¸c˜ao Box::volume() ´e compilada como: int volume(Box* const this){
return this->height * this->width * this->depth; }
int main(){
Box thisBox(4, 5, 2);
Box* otherBox = new Box(1, 2, 3);
... thisBox.volume(); // volume(&thisBox); ... otherBox->volume(); // volume(otherBox); ...
}
c++/rsb 15
MEMBROS DE CLASSE EST ´ATICOS
• Membro de classe pode ser definido como static
• Um membro est´atico ´e comum a todos os objetos da classe, havendo sempre apenas uma instˆancia do membro, que ´e
compartilhado por todos os objetos da classe
• O membro est´atico (dado ou fun¸c˜ao) deve ser anunciado na classe e definido fora dela para que passe a existir
• Membros est´aticos obedecem `as regras de escopo usuais para qualquer membro de classe
• Fun¸c˜ao membro est´atica s´o pode ter acesso a outros membros est´aticos da classe
CLASSES
MEMBROS DE CLASSE EST ´ATICOS...
class List {
static List *minhaLista; <== declara¸c~ao ...
public:
static void display(); <== declara¸c~ao ...
};
List *List::minhaLista; <=== defini¸c~ao
List *List::display( ){ ... }; <=== defini¸c~ao ...
c++/rsb 17
EXECUC¸ ˜AO DE MEMBRO EST ´ATICO SEM OBJETO
class Date {
int mo, da, yr; public:
static int format; // 1 = mm/dd/yy, 2 = dd/mm/yy
Date(int m , int d, int y){ mo = m; da = d; yr = y; } void display();
};
int Date::format;
void Date::display() {
if (format == 1)cout << mo << ’/’ << da; else cout << da << ’/’ << mo;
CLASSES
EXECUC¸ ˜AO DE MEMBRO EST ´ATICO SEM OBJETO...
FUNC¸ ˜AO CONSTRUTORA
• Tem o mesmo nome da classe e n˜ao tem tipo de retorno
• ´E opcional. Neste caso, declara¸c˜oes de objetos n˜ao implicam em chamadas de fun¸c˜oes construtoras
• Pode haver mais de uma fun¸c˜ao construtora por classe, via overloading
CLASSES
CONSTRUTORA DEFAULT
int n = 0; class Par {
int ordem; int nota; public:
Par(int ordem = 1, int nota = 10 ){
this->ordem = ordem; this->nota = nota; n++; }
int f( ){return ordem;} int g( ){return nota;} };
int main(int argc, char *argv[]) {
Par x(1,10); Par t; Par s(1); Par r[10];
Par u(1,10)[10]; //Erro:n~ao se aceitam par^ametros aqui!
printf("%d %d % d\n", n, r[9].f(), r[9].g());// Sa´ıda:13 1 10 }
c++/rsb 21
FUNC¸ ˜AO CONSTRUTORA PRIVADA
CLASSES
FUNC¸ ˜AO DESTRUIDORA
• Tem sempre o nome da classe prefixada por ˜ • No m´aximo uma por classe
• N˜ao tem parˆametro e nada retorna
• Chamada implicitamente quando objeto da classe sai do escopo, isto ´
e, no momento retorno de fun¸c˜oes ou pelo uso do operador delete
c++/rsb 23
TEMPO DE VIDA DE OBJETOS
• Objeto autom´atico ´e alocado quando sua declara¸c˜ao ´e encontrada e liberado quando se sai do bloco que a cont´em
• Objetos criados pelo operador new existem at´e que sejam destru´ıdos pelo delete
• O endere¸co retornado pelo new deve ser passado ao delete
CLASSES
CONSTRUTORA/DESTRUIDORA E FREE STORE
• new chama a construtora • delete chama a destruidora class Date{
int mo, da, yr; public:
Date(); ~Date(); };
Date::Date(){cout << "\n Funcao construtora DATE ";} Date::~Date(){cout << "\n Funcao destruidora DATE";}
c++/rsb 25
CONSTRUTORA/DESTRUIDORA E FREE ...
int main(){
Date *dt = new Date;
cout << "\nProcessa as datas "; delete dt;
return 0; }
SAIDA:
Funcao construtora Date Processa as datas
CLASSES
FUNC¸ ˜OES DESTRUIDORAS E FREE STORE
class Date {
int mo, da, yr; char *month; // default: private public:
Date();
Date(int m, int d, int y); ~Date();
void display(); };
void Date::display() {
if (month != NULL)
cout << ’\n’ << month << ’ ’ << da << ", " << yr; }
c++/rsb 27
FUNC¸ ˜OES DESTRUIDORAS E FREE STORE ...
Date::Date(){ mo = 0; da = 0; yr = 0; month = NULL; } Date::Date(int m, int d, int y) {
static char *mes[] = {
"Janeiro","Fevereiro","Mar¸co","Abril","Maio", "Junho","Julho","Agosto","Setembro",
"Outubro", "Novembro","Dezembro"}; mo = m; da = d; yr = y;
month = new char[strlen(mes[m-1])+1]; strcpy(month, mes[m-1]);
}
Date::~Date() {if (month != NULL) delete month;} int main() {
CLASSES
FUNC¸ ˜AO MEMBRO CONSTANTE
class A { int x; public:
A(){x = 10;}
void setX(int x) { this->x = x;}
int getX( ) const {return ++x;} //ERRO };
FUNC¸ ˜AO MEMBRO CONSTANTE ...
class A { int x; public:
A(){x = 10;}
void setX(int x) { this->x = x;}
int getX( ) const {return x;} // OK };
int main(int argc, char *argv[]){ A a;
printf("a.x = %d ", a.getX()); const A c;
CLASSES OBJETO CONSTANTE class A { int x; public: A() {x = 10; }
void setX(int x) { this->x = x;} int getX( ) const {return x;}
};