Linguagem de Programação C++
Universidade Federal de Santa Catarina
Departamento de Engenharia Elétrica, CTC
Prof. Eduardo Augusto Bezerra
Uma estrutura de dados é um conjunto de diversos tipos de dados, os quais podem ter tamanhos diferentes, agrupados em uma única declaração:
struct nome_modelo {
tipo1 elemento1;
tipo2 elemento2;
tipo3 elemento3;
.
.
} nome_objeto;onde nome_modelo é o nome para o novo tipo criado (definido pela struct), e o parâmetro opcional nome_objeto é um identificador válido (ou identificadores) para instâncias do objeto. Por exemplo:
struct produtos {
char nome [30];
float preco;
} ;
produtos apple;
produtos orange, melon;apple, orange e melon são todos objetos (variáveis) do tipo “produtos”. Este novo tipo é utilizado de forma semelhante aos tipos primitivos (ex. int, float, ...). Alternativamente:
struct produtos {
char nome [30];
float preco;
} apple, orange, melon;Para acessar os campos da struct de forma a realizar operações, é utilizado um ponto (.) inserido entre o nome do objeto e o nome do campo:
apple.nome
apple.preco
orange.nome
orange.preco
melon.nome
melon. preco
Exemplo com filmes:
// uso de struct
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
struct filmes_t {
char titulo [50];
int ano;
} meu, seu;
void mostra_filme (filmes_t filme);
int main ()
{
char buffer [50];
strcpy (meu.titulo , "2001 A Space Odyssey");
meu.ano = 1968;
cout << "Entre com o titulo: ";
cin.getline (seu.titulo ,50);
cout << "Entre com o ano: ";
cin.getline (buffer,50);
seu.ano = atoi (buffer);
cout << "Meu filme favorito eh:\n ";
mostra_filme (meu);
cout << "E o seu eh:\n ";
mostra_filme (seu);
return 0;
}
void mostra_filme (filmes_t filme)
{
cout << filme.titulo;
cout << " (" << filme.ano << ")\n";
}
|
Entre com o titulo: Alien |
Exemplo de array (vetor) de structs:
// array de structs
#include <iostream>
#include <stdlib.h>
using namespace std;
#define N_MOVIES 5
struct movies_t {
char title [50];
int year;
} films [N_MOVIES];
void printmovie (movies_t movie);
int main ()
{
char buffer [50];
int n;
for (n=0; n<N_MOVIES; n++)
{
cout << "Nome do filme: ";
cin.getline (films[n].title,50);
cout << "Ano: ";
cin.getline (buffer,50);
films[n].year = atoi (buffer);
}
cout << "\nFilmes favoritos:\n";
for (n=0; n<N_MOVIES; n++)
printmovie (films[n]);
return 0;
}
void printmovie (movies_t movie)
{
cout << movie.title;
cout << " (" << movie.year << ")\n";
}
|
Nome do filme: Pulp Fiction |
Uma classe, de forma semelhante ao que ocorre com structs, é um tipo definido pelo usuário.
A classe é a unidade de ocultação e encapsulamento de dados do C++.
Declaração de classe especifica a representação de objetos da classe e o conjunto de operações que se pode aplicar a tais objetos.
Instância de uma classe: QUANDO UMA VARIÁVEL É DECLARADA DO TIPO DA CLASSE, UMA INSTÂNCIA DA CLASSE É CRIADA. ESSA INSTÂNCIA É DENOMINADA UM OBJETO.
Palavras utilizadas para a definição de classes:
class
struct
union
Em uma classe declarada com struct as funções membros e variáveis são públicos por default. Isso significa que todos podem ser acessados com o operador . .
Se a palavra class é utilizada para declarar a classe, então os membros são privados por default.
O conceito de classe em C++ pode ser visto como uma generalização da noção de estrutura em C (struct em C não suporta funções).
Uma declaração de classe introduz um novo tipo, da mesma forma como apresentado para struct. Exemplo:
struct x {
int a;
}
struct y {
int a;
}
x a1;
y a2;
int a3;
a1 = a2; // erro: tipo y atribuído a tipo x
a1 = a3; // erro: tipo int atribuído a tipo x
Projeto de uma classe:
Ao pensar sobre a classe a ser criada, imaginar qual será o objetivo da classe. Quais as propriedades e capacidades o objeto instanciado a partir dessa classe deverá possuir? Como será a interação entre esse objeto e outros?
Listar qualquer dado relevante que precisa ser encapsulado no objeto como membro.
Listar tudo o que o objeto sabe, e encapsular esses dados no objeto como funções membro.
Solidificar a interface da classe. Escrever a declaração da classe e explorar as relações entre os membros (funções e dados). Decidir quais dados devem ser expostos e quais devem ser ocultados.
Estudo de caso: classe SystemUser
/* File SystemUser.h
Eduardo Augusto Bezerra <Eduardo.Bezerra @ eel.ufsc.br>
Departamento de Engenharia Elétrica, CTC, UFSC
Agosto de 2012.
Descricao: Definicao dos "headers" (interface) para a classe SystemUser
*/
#include <string>
using namespace std;
class SystemUser {
string userName;
string password;
char accessLevel;
public:
SystemUser();
~SystemUser();
void setUserName(string newUserName);
void setPassword(string newPassword);
void setAccessLevel(char newAccessLevel);
string getUserName();
string getPassword();
char getAccessLevel();
};
/* File SystemUser.cpp
Eduardo Augusto Bezerra <Eduardo.Bezerra @ eel.ufsc.br>
Departamento de Engenharia Elétrica, CTC, UFSC
Agosto de 2012.
Descricao: Definicao das funcoes membro para os "headers" declarados na classe SystemUser
*/
#include "SystemUser.h"
using namespace std;
SystemUser::SystemUser() {
userName = "";
password = "";
accessLevel = 'X';
}
SystemUser::~SystemUser() {
userName = "";
password = "";
accessLevel = 'X';
}
void SystemUser::setUserName(string newUserName) {
userName = newUserName;
}
void SystemUser::setPassword(string newPassword) {
password = newPassword;
}
void SystemUser::setAccessLevel(char newAccessLevel) {
accessLevel = newAccessLevel;
}
string SystemUser::getUserName(){
return userName;
}
string SystemUser::getPassword(){
return password;
}
char SystemUser::getAccessLevel(){
return accessLevel;
}
/* File test_SystemUser.cpp
Eduardo Augusto Bezerra <Eduardo.Bezerra @ eel.ufsc.br>
Departamento de Engenharia Elétrica, CTC, UFSC
Agosto de 2012.
Descricao: Programa de teste para a classe SystemUser.
*/
#include <iostream>
#include "SystemUser.cpp"
using namespace std;
int main() {
SystemUser usuario1, usuario2;
string aux_user;
char aux_level;
string aux_passwd;
cout << "User name? ";
cin >> aux_user;
cout << endl << "Password? ";
cin >> aux_passwd;
cout << endl << "Access level (A to E)? ";
cin >> aux_level;
usuario1.setUserName(aux_user);
usuario1.setPassword(aux_passwd);
usuario1.setAccessLevel(aux_level);
usuario2.setUserName("Eduardo Bezerra");
usuario2.setPassword("1234567890");
usuario2.setAccessLevel('D');
// usuario1 = usuario2;
cout << endl << "----------------------" << endl;
cout << "User name: " << usuario1.getUserName() << endl;
cout << "Password: " << usuario1.getPassword() << endl;
cout << "Access Level: " << usuario1.getAccessLevel() << endl;
cout << endl << "----------------------" << endl;
cout << "User name: " << usuario2.getUserName() << endl;
cout << "Password: " << usuario2.getPassword() << endl;
cout << "Access Level: " << usuario2.getAccessLevel() << endl;
}