Curso de programación Universidad Nacional de Costa Rica
La definición de una clase inicia con la palabra reservada class
seguida del nombre de la clase, por convención el nombre de la clase siempre empieza con mayúscula, cada parabra subsecuente también empieza con mayúscula, ejemplo: GradeBook
.
Palabra Clave | Descripción |
---|---|
public |
Todos tienen acceso |
protected |
Sólo la clase en sí, las clases derivadas y los amigos tienen acceso. |
private |
Sólo la clase en sí y los amigos tienen acceso. |
Cuando el tipo se define con la palabra clave de class
, el especificador de acceso predeterminado es private
, pero si el tipo se define con la palabra clave struct
, el especificador de acceso predeterminado es public
:
struct MyStruct { int x; };
class MyClass { int x; };
MyStruct s;
s.x = 9; // well formed, because x is public
MyClass c;
c.x = 9; // ill-formed, because x is private
Es un lenguaje gráfico para visualizar, especificar, construir y documentar un sistema. UML ofrece un estándar para describir un “plano” del sistema (modelo), incluyendo aspectos conceptuales tales como procesos, funciones del sistema, y aspectos concretos como expresiones de lenguajes de programación, esquemas de bases de datos y compuestos reciclados. Wiki
Ejemplo de myfirstclass.cpp:
Al crear una clase definimos una parte pública y una parte privada, por lo que estos métodos ya dichos, son métodos de acceso, lo que significa que generalmente son una interfaz pública para cambiar miembros de las clases privadas.
Los métodos getter
y setter
se utilizan para definir una propiedad, a estos se accede como propiedades situadas fuera de la clase, aunque las defina dentro de la clase como métodos.
class GradeBook {
private:
std::string courseName;
public:
// SETTERS
void setCourseName(const std::string &name) { courseName = name; }
// GETTERS
std::string getCourseName() { return courseName; }
// function that displays a welcome message
void displayMessage() {
// this statement calls getCourseName to get the name of the course
// this GradeBook represents
std::cout << "Welcome to the grade book for\n"
<< getCourseName() << "!" << std::endl;
}
};
La mayoría de declaraciones van despues de modificador de acceso
private:
std::string courseName;
Sirve para asignar un valor inicial a un atributo, pero de forma explícita, y solo nos permite dar acceso público a ciertos atributos que deseemos el usuario pueda modificar. Es decir permiten cambiar el valor de los atributos.
public:
// SETTERS
void setCourseName(const std::string &name) { courseName = name; }
...
Sirve para obtener (recuperar o acceder) el valor ya asignado a un atributo y utilizarlo para cierto método.
public:
...
// GETTERS
std::string getCourseName() { return courseName; }
No retorna ningun dato, por eso es void
pero permite mostrar el contenido de la clase.
public:
...
// function that displays a welcome message
void displayMessage() {
// this statement calls getCourseName to get the name of the course
// this GradeBook represents
std::cout << "Welcome to the grade book for\n"
<< getCourseName() << "!" << std::endl;
}
example_getset.cpp define class GradeBook that contains a courseName data member and member functions to set and get its value; Create and manipulate a GradeBook object with theses functions.
Los constructores son funciones miembro especiales que sirven para inicializar un objeto de una determinada clase al mismo tiempo que se declara.
Los constructores son especiales por varios motivos:
public:
explicit GradeBook(const std::string &name) { setCourseName(name); }
Se declaró el constructor como explicit
dado que sólo recibe un parámetro.
Se recomienda declarar todos los constructores de un único parámetro como
explicit
exa_constructor.cpp Instantiating multiple objects of the GradeBook class and using the GradeBook constructor to specify the course name when each GradeBook object is created.
Cualquier constructor sin argumentos se llama constructor default. Una clase puede obtener un constructor default de la siguiente forma:
Una de las ventajas de crear definiciones de clase es que, cuando se empaqueta correctamente, otros programadores pueden reutilizar sus clases. Por ejemplo, puede reutilizar la Biblioteca estándar de C ++ de tipo string
en cualquier programa de C ++ al incluir el encabezado <string>
.
Al crear un programa C ++ orientado a objetos, es habitual definir el código fuente reutilizable (como una clase) en un archivo que, por convención, tiene una extensión de nombre de archivo .h, conocida como headers.
Los programas usan directivas de preprocesamiento #include
para incluir encabezados y aprovechar los componentes de software reutilizables.
Código Fuente => GradeBook.h
#include <iostream>
#include <string>
// GradeBook class definition
class GradeBook {
private:
std::string courseName;
public:
explicit GradeBook(const std::string &name) { setCourseName(name); }
// SETTERS
void setCourseName(const std::string &name) { courseName = name; }
// GETTERS
std::string getCourseName() { return courseName; }
// display a welcome message to the GradeBook user
void displayMessage() {
std::cout << "Welcome to the grade book for\n"
<< getCourseName() << "!" << std::endl;
}
};
Código Fuente => GradeBook.cpp
#include <iostream>
#include "GradeBook.h"
// function main begins program excution
int main(int argc, const char *argv[]) {
// create two GradeBook objects
GradeBook gradeBook1("CS101 Introduction to C++ Programming");
GradeBook gradeBook2("Cs102 Data Structures in C++");
// display initial value of courseName for each GradeBook
std::cout << "gradeBook1 created for course: "
<< gradeBook1.getCourseName();
std::cout << "\ngradeBook2 created for course: "
<< gradeBook2.getCourseName() << std::endl;
return 0;
}
Separar la interfaz de la aplicación es un principio fundamental de la ingeniería de software.
Las interfaces definen y estandarizan las formas en que cosas como las personas y los sistemas interactúan entre sí. Por ejemplo, los controles de una radio sirven como una interfaz entre los usuarios de la radio y sus componentes internos. Los controles permiten a los usuarios realizar un conjunto limitado de operaciones (como cambiar la estación, ajustar el volumen y elegir entre estaciones AM y FM). Varias radios pueden implementar estas operaciones de manera diferente: algunas proporcionan botones pulsadores, algunas proporcionan botones digitales y otras admiten comandos de voz. La interfaz especifica qué operaciones permite que los usuarios realicen una radio, pero no especifica cómo se implementan las operaciones dentro de la radio.
De manera similar, la interfaz de una clase describe qué servicios pueden usar los clientes de una clase y cómo solicitar esos servicios, pero no cómo la clase podría llevar a cabo los servicios. La interfaz pública de una clase consta de las funciones de miembro público de la clase (también conocidas como servicios públicos de la clase).
Código Fuente => GradeBook.h
#pragma once
#include <string>
class GradeBook {
private:
std::string courseName;
public:
explicit GradeBook(const std::string &);
// SETTERS
void setCourseName(const std::string &);
// GETTERS
std::string getCourseName();
void displayMessage();
};
Código Fuente => GradeBook.cpp
#include "GradeBook.h"
#include <iostream>
#include <string>
// Constructor
GradeBook::GradeBook(const std::string &name) { setCourseName(name); }
// SETTERS
void GradeBook::setCourseName(const std::string &name) { courseName = name; }
// GETTERS
std::string GradeBook::getCourseName() { return courseName; }
// display a welcome message to the GradeBook user
void GradeBook::displayMessage() {
std::cout << "Welcome to the grade book for\n"
<< getCourseName() << "!" << std::endl;
}
Código Fuente => MainAppInterface.cpp
#include <iostream>
#include "GradeBook.h"
int main(int argc, const char *argv[]) {
GradeBook gradeBook1("CS101 Introduction to C++ Programming.");
GradeBook gradeBook2("CS102 Data Structures in C++.");
// display initial values of courseName for each GradeBook
std::cout << "gradeBook1 created for course: "
<< gradeBook1.getCourseName();
std::cout << "\ngradeBook2 created for course: "
<< gradeBook2.getCourseName() << std::endl;
return 0;
}
Es un ejemplo interesante de como reutilizar las funciones SET para propósitos lógicos.
Código Fuente => GradeBook.h
#pragma once
#include <string>
class GradeBook {
private:
std::string courseName;
public:
explicit GradeBook(const std::string &);
// SETTERS
void setCourseName(const std::string &);
// GETTERS
std::string getCourseName();
void displayMessage();
};
Código Fuente => GradeBook.cpp
#include "GradeBook.h"
#include <iostream>
#include <string>
GradeBook::GradeBook(const std::string &name) { setCourseName(name); }
// SETTERS
// ensure coursename does not exceed 25 chars
void GradeBook::setCourseName(const std::string &name) {
if (name.length() <= 25) { courseName = name; }
if (name.length() > 25) {
courseName = name.substr(0, 25);
std::cout << "Name \"" << name << "\" exceeds maximum length (25).\n";
std::cout << "Limiting courseName to first 25 characters.\n"
<< std::endl;
}
}
// GETTERS
std::string GradeBook::getCourseName() { return courseName; }
// display a welcome message to the GradeBook user
void GradeBook::displayMessage() {
std::cout << "Welcome to the grade book for\n"
<< getCourseName() << "!" << std::endl;
}
Código Fuente => MainAppValidations.cpp
#include <iostream>
#include "GradeBook.h"
int main(int argc, const char *argv[]) {
GradeBook gradeBook1("CS101 Introduction to Programming in C++");
GradeBook gradeBook2("CS102 C++ Data Structures");
// display each GradeBook's courseName
std::cout << "gradeBook1 initial course name: "
<< gradeBook1.getCourseName();
std::cout << "\ngradeBook2 initial course name: "
<< gradeBook2.getCourseName() << std::endl;
// modify myGradeBook's courseName (with a valid length string)
gradeBook1.setCourseName("CS101 C++ Programming");
// display each GradeBook's courseName
std::cout << "\ngradeBook1 course name: " << gradeBook1.getCourseName();
std::cout << "\ngradeBook2 course name: " << gradeBook2.getCourseName()
<< std::endl;
return 0;
}
####