Declaraciones y definiciones (C++)

Un programa de C++ consta de varias entidades, como variables, funciones, tipos y espacios de nombres. Cada una de estas entidades debe declararse para que puedan usarse. Una declaración especifica un nombre único para la entidad, junto con información sobre su tipo y otras características. En C++, el punto en el que se declara un nombre es el punto en el que se vuelve visible para el compilador. No puede referirse a una función o clase que se declara en un punto posterior en la unidad de compilación. Las variables se deben declarar lo más cerca posible antes del punto en el que se usan.

En el siguiente ejemplo se muestran algunas declaraciones:

#include <string>

int f(int i); // forward declaration

int main()
{
    const double pi = 3.14; //OK
    int i = f(2); //OK. f is forward-declared
    C obj; // error! C not yet declared.
    std::string str; // OK std::string is declared in <string> header
    j = 0; // error! No type specified.
    auto k = 0; // OK. type inferred as int by compiler.
}

int f(int i)
{
    return i + 42;
}

namespace N {
   class C{/*...*/};
}

En la línea 5, se declara la función main. En la línea 7, una variable const denominada pi se declara e inicializa. En la línea 8, un entero i se declara e inicializa con el valor generado por la función f. El nombre f es visible para el compilador debido a la declaración de desviar en la línea 3.

En la línea 9, se declara una variable denominada obj de tipo C. Sin embargo, esta declaración genera un error porque C no se declara sino hasta más adelante en el programa y no se declara directamente. Para corregir el error, puede mover toda la definición de C antes de main o bien agregar una declaración directa para ella. Este comportamiento es diferente de otros lenguajes, como C#. En esos lenguajes, se pueden usar funciones y clases antes de su punto de declaración en un archivo de origen.

En la línea 10, se declara una variable denominada str de tipo std::string. El nombre std::string es visible porque se introduce en el stringarchivo de encabezado, que se combina en el archivo de origen en la línea 1. std es el espacio de nombres en el que se declara la clase string.

En la línea 11, se produce un error porque el nombre j no se ha declarado. Una declaración debe proporcionar un tipo, a diferencia de otros lenguajes, como JavaScript. En la línea 12, se usa la palabra clave auto, que indica al compilador que infiere el tipo de k en función del valor con el que se inicializa. En este caso, el compilador elige int para el tipo.

Ámbito de la declaración

El nombre introducido por una declaración es válido dentro del ámbito en el que se produce la declaración. En el ejemplo anterior, las variables declaradas dentro de la función main son variables locales. Podría declarar otra variable denominada i además de la principal, en el ámbito global, y sería una entidad independiente. Sin embargo, esta duplicación de nombres puede provocar confusión y errores del programador, y debe evitarse. En la línea 21, la clase C se declara en el ámbito del espacio de nombres N. El uso de espacios de nombres ayuda a evitar colisiones de nombres. La mayoría de los nombres de la biblioteca estándar de C++ se declara en el espacio de nombres std. Para obtener más información sobre la interacción entre las reglas de ámbito y las declaraciones, consulte Ámbito.

Definiciones

Algunas entidades, incluidas las funciones, las clases, las enumeraciones y las variables constantes, deben definirse así como declararse. Una definición proporciona al compilador toda la información que necesita para generar código de máquina cuando la entidad se usa más adelante en el programa. En el ejemplo anterior, la línea 3 contiene una declaración para la función f, pero la definición de la función se proporciona en las líneas 15 a 18. En la línea 21, la clase C se declara y define (aunque tal como se define, la clase no hace nada). Se debe definir una variable constante; en otras palabras, se le debe asignar un valor, en la misma instrucción en la que se declara. Una declaración de un tipo integrado, como int, constituye automáticamente una definición porque el compilador sabe cuánto espacio asignar para ella.

El ejemplo siguiente muestra declaraciones que también son definiciones:

// Declare and define int variables i and j.
int i;
int j = 10;

// Declare enumeration suits.
enum suits { Spades = 1, Clubs, Hearts, Diamonds };

// Declare class CheckBox.
class CheckBox : public Control
{
public:
    Boolean IsChecked();
    virtual int     ChangeState() = 0;
};

Estas son algunas declaraciones que no son definiciones:

extern int i;
char *strchr( const char *Str, const char Target );

Definiciones de tipo e instrucciones "using"

En versiones anteriores de C++, la palabra clave typedef se usa para declarar un nuevo nombre que es un alias para otro nombre. Por ejemplo, el tipo std::string es otro nombre para std::basic_string<char>. Debe ser obvio por qué los programadores usan el nombre de definición de tipo y no el nombre real. En C++moderno, se prefiere la palabra clave using a typedef, pero la idea es la misma: se declara un nuevo nombre para una entidad, que ya está declarada y definida.

Miembros de clases estáticas

Los miembros de datos de clase estática son variables discretas compartidas por todos los objetos de la clase. Dado que se comparten, deben definirse e inicializarse fuera de la definición de clase. Para más información, consulte Clases.

declaraciones externas

Un programa de C++ podría contener más de una unidad de compilación. Para declarar una entidad que se define en una unidad de compilación independiente, use la palabra clave extern. La información de la declaración es suficiente para el compilador. Sin embargo, si la definición de la entidad no se encuentra en el paso de vinculación, entonces el enlazador generará un error.

En esta sección

Clases de almacenamiento
const
constexpr
extern
Inicializadores
Alias y definiciones de tipo
using declaración
volatile
decltype
Atributos de C++

Consulte también

Conceptos básicos