clases y objetos en c - info ii

Upload: bruno-porcelli

Post on 14-Feb-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/23/2019 Clases y Objetos en c - Info II

    1/10

  • 7/23/2019 Clases y Objetos en c - Info II

    2/10

    Informtica II Clases y Objetos Pg. 2

    Clases y Objetos en C++

    Introduccin

    Las variables de los tipos fundamentales de datos no son suficientes para modelar

    adecuadamente objetos del mundo real. Por ejemplo, no se puede modelar un vagn de tren

    mediante un int, pero si se definen las variables alto, ancho y longitud para representar las

    dimensiones de un vagn, se las puede juntar en una estructura de datos llamada Vagon. A

    continuacin es posible definir variables de este nuevo tipo de la misma manera que con

    variables de tipos bsicos. Se pueden crear, manipular y destruir tantos objetos de tipo

    Vagon como se quiera. De esta manera puede verse cmo C++ incorpora la nocin de

    clasedel paradigma de Orientacin a Objetos. La palabra classes la palabra claave para

    implementar este concepto.

    Veamos cmo se puede definir una clase que representa vagones:

    classVagon {

    doublealto;

    doubleancho;

    doublelongitud;

    };

    Las variables que se definen como parte de la clase se llaman datos miembrode la clase.

    Se puede hacer una declaracin de una variable de esta clase, digamos vagonGrande,que representa una instancia de tipo Vagoncomo la siguiente:

    Vagon vagonGrande;

    Una vez que se ha definido la clase Vagon, las declaraciones de variables de este tipo son

    estndares. Estas variables son instancias de la clase y se las llama objetos.

    Clases

    La definicin de una clase es la especificacin de un nuevo tipo de dato. Puedecontener elementos que pueden tener variables tanto de los tipos bsicos como de otros

    tipos definidos por el usuario. Pueden ser elementos simples o arreglos, punteros, arreglos

    de punteros, etc. Adems una clase puede contener funciones que operan sobre los objetos

    de esa clase accediendo a sus elementos. De esta manera, una clase combina la definicin

    de los datos que componen un objeto y los medios para manipularlos.

    Los datos y funciones de una clase son llamados miembros de la clase. Lasfunciones miembro, a veces, tambin son llamadas mtodos. A los datos miembro se los

    suele llamar campos.

  • 7/23/2019 Clases y Objetos en c - Info II

    3/10

    Informtica II Clases y Objetos Pg. 3

    Cuando se define una clase, no se define un dato, sino qu significa el nombre de la

    clase, en qu consiste un objeto de esa clase y qu operaciones pueden realizarse sobre los

    objetos de esa clase.

    Definicin de una clase:

    Veamosnuevamente la clase mencionada anteriormente, la clase de los vagones. Se utiliz

    la palabra clave classde la siguiente manera:

    classVagon {

    doublealto;

    doubleancho;

    doublelongitud;

    };

    El nombre de la clase aparece siguiendo la palabra clave class, y los tres datos miembro

    se declaran entre llaves. La definicin de la clase completa debe terminar con punto y coma.

    Los nombres de todos los miembros de la clase son locales a la clase, por lo que se puede

    utilizar los mismos nombres en cualquier parte del programa sin causar inconvenientes.

    Control de acceso en una clase:

    Se puede especificar que los miembros de una clase sean public, private o

    protected. Por defecto los miembros de una clase son private.

    Recordemos que cuando se define una clase, que es un tipo de datos, no se declara ningn

    objeto del tipo de la clase. Cuando hablamos de acceso a un miembro de la clase, porejemplo la altura, estamos hablando acerca del acceso al miembro de datos de un objeto

    particular, que debe ser definido en algn momento.

    Declaracin de objetos de una clase:

    Los objetos de una clase se declaran de exactamente la misma manera que los tipos bsicos.

    Se pueden declarar objetos de la clase Vagn con las siguientes sentencias:

    Vagon vagon1;

    Vagon vagon2;

    Cada objeto de la clase Vagon(vagon1 y vagon2), tiene sus propios datos miembro. Esto

    se muestra en la figura:

  • 7/23/2019 Clases y Objetos en c - Info II

    4/10

    Informtica II Clases y Objetos Pg. 4

    Los campos miembro no estn inicializados, contienen basura, por lo que se necesita alguna

    forma de acceder a ellos.

    Funciones miembro de una clase:

    Una funcin miembro de una clase es una funcin que tiene su definicin o su prototipo

    dentro de la definicin de la clase.

    Las funciones miembro siempre tienen acceso a todos los campos de la clase. Por ejemplo,

    si deseamos proveer a la clase Vagonde una funcin que retorne el volmen del vagn

    desde el cual se la invoca, podemos escribir:

    classVagon {

    doublealto;doubleancho;

    doublelongitud;

    public:

    doubleVolumen() {

    returnalto * ancho * longitud;

    }

    };

    En la definicin de la clase, contamos con la seccin de los miembros privados (private),

    que es el acceso por defecto y la seccin de los miembros pblicos (public), que son los

    que aparecen despus de la etiqueta indicadora.Si la definicin de una clase miembro se desea realizar fuera de la definicin de la clase, se

    debe poner el prototipo de la funcin dentro de la clase. Como la definicin de la funcin

    aparece afuera de la clase, debe haber una manera de decirle al compilador que esa funcin

    pertenece a la clase. Esto se realiza anteponiendo al nombre de la funcin el nombre de la

    clase, y separando ambos por el operador de resolucin de alcance, '::'. Lo ilustramos enel siguiente ejemplo:

    classVagon {

    doublealto;

    doubleancho;

    doublelongitud;

    public:

    doubleVolumen(void);

    };

    Vagon::Volumen() {

    returnalto * ancho * longitud;

    }

    Esto produce el mismo efecto que el ejemplo anterior, pero no genera exactamente el

    mismo programa. En el segundo caso, todos los llamados a la funcin son tratatos de la

  • 7/23/2019 Clases y Objetos en c - Info II

    5/10

    Informtica II Clases y Objetos Pg. 5

    manera habitual. Sin embargo, si la definicin de la funcin est dentro de la definicin de

    la clase, el compilador considera implcitamente a la misma como una funcin inline. Conuna funcin inline el compilador expande el cdigo del cuerpo de la funcin en el lugar del

    llamado a la misma. Esto hace que el cdigo sea ms rpido.

    Constructores

    En algunos casos, inicializar todos los campos de una clase, demanda grandes porciones de

    cdigo. Adems, como los campos son privados, no se tiene acceso a ellos desde fuera de la

    clase.

    Un constructor de clase es una funcin especial que crea nuevos objetos. Por consiguiente,

    un constructor provee la oportunidad de inicializar los objetos al momento de ser creados,

    asignndoles valores vlidos. Una clase puede contener varios constructores permitiendo

    crear objetos de varias maneras.Los constructores siempre tienen el mismo nombre que la clase en la cual estn definidos.

    Adems, los constructores no tienen valor de retorno. El mismo no es necesario, ni se

    permite. A continuacin vemos un ejemplo con un constructor para la clase Vagon. Por lo

    tanto ya estamos en condiciones de ver un programa completo:

    #include

    usingstd::cout;

    usingstd::endl;

    classVagon {

    doublealto;

    doubleancho;

    doublelongitud;

    public:

    Vagon (doubleal, doublean, doublelogt) {

    alto = al;

    ancho = an;

    longitud = logt;

    }

    doubleVolumen() {

    returnalto * ancho * longitud;

    }};

    intmain() {

    Vagon unVagon(2.8, 2.7, 7.9);

    cout

  • 7/23/2019 Clases y Objetos en c - Info II

    6/10

    Informtica II Clases y Objetos Pg. 6

    Un constructor que requiere un nico argumento no necesita ser llamado explcitamente.

    Por ejemplo:

    Vagon v = 2.8;

    es lo mismo que

    Vagon v(2.8);

    El constructor por defecto

    Si no se desea inicializar los campos en un constructor, se puede definir un constructor por

    defecto, tambin llamado constructor noarg:

    Vagon () {};

    El mismo puede ser definido por el programador, pero en el caso de que no se provea

    ningn constructor en una clase, el compilador generar un constructor por defecto. En

    cualquiera de los dos casos, es el constructor que se invoca en una sentencia como la que

    vimos anteriormente:

    Vagon vagon1;

    Asignacin de parmetros por defectoDe la misma manera que con las funciones ordinarias, se pueden establecer valores por

    defecto en funciones miembro y constructores. Por ejemplo:

    Vagon (doubleal, doublean, doublelogt = 8.0) {

    alto = al;

    ancho = an;

    longitud = logt;

    }

    Listas de inicializacinPuede utilizarse una tcnica alternativa para inicializar campos en un constructor llamada

    Listas de inicializacin, cuyo formato puede verse en el siguiente ejemplo:

    Vagon (doubleal, doublean, doublelogt = 8.0): alto(al),

    ancho(an), longitud(logt) {}

    Es muy comn, que utilizando este estilo, el cuerpo del constructor quede vaco.

  • 7/23/2019 Clases y Objetos en c - Info II

    7/10

    Informtica II Clases y Objetos Pg. 7

    El constructor de copia por defecto

    El constructor de copia por defecto es invocado cuando se quiere inicializar un objeto a

    partir de otro. Por ejemplo:

    Vagon unVagon(2.8, 2.7, 7.9);

    Vagon otroVagon = unVagon;

    En este caso se inicializa un nuevo objeto llamado otroVagon con las mismas

    dimensiones que el objeto unVagon. En las clases que poseen punteros o arreglos como

    campos miembro, el constructor de copia por defecto no funciona como se espera, pues los

    punteros se copian y los punteros del nuevo objeto quedan apuntando a los miembros del

    primero.

    Cuando se implementa un constructor de copia, el parmetro debe ser una referencia

    constante:

    Vagon(const Vagon& unVagon);

    Acceso a campos miembro privados

    Como habamos mencionado, desde afuera de una clase no se puede acceder a sus

    miembros privados. A la vez, observamos que en un diseo orientado a objetos, el

    encapsulamiento es una caracterstica esencial. Debemos proteger los campos en la medida

    de lo posible, pero esto no significa que deban ser secretos. En la seccin pblica de la

    clase, se pueden definir funciones para controlar el acceso a los datos privados. Estasfunciones tienen como tipo de retorno el mismo tipo del campo miembro en cuestin, se las

    llama con el prefijo gety no reciben ningn argumento. El cuerpo consiste simplemente

    en retornar el valor actual del atributo. En el siguiente ejemplo se muestra cmo se permite

    conocer el estado del campo altodesde fuera de la clase:

    doublegetAlto() {

    returnalto;

    }

    En general, se definen funciones similares para cada campo que se quiera hacer disponible

    desde fuera de la clase sin perjudicar la seguridad de la misma.

    Modificacin de campos miembro privados

    Si se permite setear o modificar valores de campos privados, se procede de manera similar,

    mediante la definicin de funciones. Estas ltimas no retornan ningn valor, se las llama

    con el prefijo sety reciben como argumento el valor que ser asignado al campo miembro

    o una referencia del mismo tipo. El cuerpo consiste simplemente en asignar al campo en

    cuestin, el valor recibido como argumento. En el siguiente ejemplo se muestra cmo se

    permite modificar el estado del campo altodesde fuera de la clase:

  • 7/23/2019 Clases y Objetos en c - Info II

    8/10

    Informtica II Clases y Objetos Pg. 8

    void setAlto(double al) {

    alto = al;

    }

    Funciones amigas

    Existen algunas cirscunstancias donde se desea que algunas funciones que no son miembros

    de una clase, tengan acceso a todos los miembros privados de la misma. Tales funciones

    son llamadas amigas de la clase. Se las declara anteponiendo la palabra clave friend.Se debe tener en cuenta que si bien el prototipo de las funciones amigas se declara dentro

    de la definicin de la clase, stas no son miembros de la misma, por lo tanto los atributos de

    acceso no se aplican sobre ellas.

    El puntero this

    Cuando se ejecuta una funcin miembro, sta contiene un puntero oculto llamado this,

    que apunta al objeto mediante el cual se hizo la llamada a la funcin. Cuando durante la

    ejecucin se accede a un campo miembro de una clase, por ejemplo alto, en realidad la

    referencia es this->alto. El nombre del puntero thises agregado por el compilador a

    los miembros en las funciones. Tambin se puede hacer mencin explcita a este puntero.

    Miembros estticos de una claseLos datos y las funciones miembro de una clase pueden ser declarados static.

    Cuando se declara como esttico un campo miembro, ste se crea una nica vez y es

    compartido por todos los objetos de la clase. Cada objeto posee su propia copia de cada uno

    de los campos miembro ordinarios, pero existe slo una instancia de los campos miembro

    estticos, independientemente de la cantidad de objetos de la clase que sean creados. Un

    uso comn de un dato miembro esttico es para contar cuntos objetos de una clase existen.

    Por ejemplo, se puede declarar en la seccin pblica de una clase:

    static int cantVagones;

    No se puede inicializar un dato miembro esttico en la definicin de la clase. Por ello, la

    sentencia debe estar fuera de la clase, por ejemplo de la siguiente manera:

    int Vagon::cantVagones = 0;

    Se puede hacer referencia a un campo miembro esttico desde una instancia de la clase o

    desde la clase misma:

    cout

  • 7/23/2019 Clases y Objetos en c - Info II

    9/10

    Informtica II Clases y Objetos Pg.

    Los campos estticos de una clase se crean automticamente cuando el programa comienza

    y se inicializan con el valor 0, es por ello que existen a pesar de que no se instancie ningn

    objeto de la clase.

    Cuando se declara como esttica una funcin, se la hace independiente de cualquier objeto

    de la clase. La ventaja es que existe y puede ser invocada antes de que se instancie

    cualquier objeto. Estas funciones, al igual que los campos miembro estticos, pueden

    llamarse desde un objeto instanciado o a partir del nombre de la clase.

    Destructores

    Un destructor es una funcin miembro que destruye un objeto cuando ya no se lo necesita o

    cuando queda fuera de alcance. Tiene el mismo nombre que la clase pero precedido con

    tilde (~). No retorna ningn valor y tampoco toma ningn parmetro, por lo que slo puede

    existir un nico destructor por clase.

    Si no se define un destructor para una clase, el compilador siempre genera un destructor por

    defecto, pero ste no elimina objetos que han alocado memoria con el operador new. Por

    eso se debe definir el destructor con el correspondiente operador delete.

    Por ejemplo, si un constructor de una clase ClaseAes:

    ClaseA(const char * texto = "Un mensaje") {

    mensaje = new char[strlen(texto) + 1];

    strcpy(mensaje, texto);

    }

    Entonces el destructor puede ser:

    ~ClaseA() {

    delete[] mensaje;

    }

    Sobrecarga de operadores

    La sobrecarga de operadores permite que los operadores estndares de C++ puedan

    programarse para operar con los tipos de datos o clases definidas por el usuario. No est

    permitido inventar nuevos operadores ni cambiar la precedencia de los existentes.

    Obviamente, se espera que el comportamiento de un operador sobrecargado sea consistente

    con el uso normal que se le da al mismo y razonablemente intuitivo.

    Slo algunos operadores no pueden sobrecargarse: (::,?:,.,sizeof y.*)

    Ejemplo:

    Sobrecargamos el operador < (menor) para la clase Vagon, considerando que un vagn es

    menor que otro si tiene menor volmen.

  • 7/23/2019 Clases y Objetos en c - Info II

    10/10

    Informtica II Clases y Objetos Pg. 1!

    bool Vagon::operator< (const Vagon& unVagon) const {

    return this->Volumen() < unVagon.Volumen();

    }

    Aqu operatores una palabra clave, que junto con el operador (separado por espacio o

    no) definen el nombre de la funcin. Notar que la funcin se define const porque no

    modifica los datos miembro de la clase. Tambin el argumento debe ser una referencia

    constante.

    El operador < es binario infijo, es decir, toma un operando a la izquierda y un operando a la

    derecha. En este caso, podremos escribir

    if (vagon1 < vagon2) cout