[C/C++] Comprensión profunda de la palabra clave const en C y C++

Introducción:
        En programación C y C++, la palabra clave const es un concepto común e importante. Se puede usar para modificar variables, funciones, punteros y miembros de clase, lo que puede proteger los datos de la modificación, mejorar la legibilidad del código y la seguridad. Aunque C y C++ comparten las mismas palabras clave, existen algunas diferencias sutiles cuando se usa la palabra clave const.

        Este blog explorará en profundidad los diversos usos, precauciones y diferencias de la palabra clave const en C y C++.

Tabla de contenido

1. Uso básico de la palabra clave const en C

1.1 Declaración e inicialización de variables

1.2 Parámetros de función y valores de retorno

1.3 Punteros y matrices

2. Uso básico de la palabra clave const en C++

2.1 Declaración e inicialización de variables

2.3 Punteros y referencias

3. El papel de const en C y C++

3.1 Proteger los datos de la modificación

3.2 Mejorar la legibilidad y el mantenimiento del código

4. constante y función

4.1 parámetros de la función const y valores devueltos

4.2 puntero de función constante y puntero de función constante

5. constante y puntero

5.1 puntero const y constante de puntero

5.2 puntero modificado const y puntero a const

6. constante frente a clase (solo C++)

6.1 variable miembro const y función miembro const

6.3 Puede modificar variables miembro mutables

7. La diferencia entre const y C y C++

7.1 La diferencia entre const durante la compilación y el enlace

7.2 Diferencias entre variables globales modificadas const y variables estáticas

7.3 Diferencias entre constantes de cadena modificadas const


1. Uso básico de la palabra clave const en C

1.1 Declaración e inicialización de variables

        En C, la palabra clave const generalmente se usa para declarar una constante, lo que indica que no se puede modificar. Las constantes deben inicializarse en el momento de la declaración, por ejemplo:

const int YEAR = 2021;

1.2 Parámetros de función y valores de retorno

En C, puede usar la palabra clave const para especificar parámetros de función y valores de retorno.

Por ejemplo:

int compute(const int a, const int b) {
    // do some computation here
}

const char* get_version() {
    return "v1.0";
}

        Aquí, los parámetros a y b de la función computar se declaran const, lo que indica que no se modificarán. La función get_version devuelve un puntero de tipo const char*, que apunta a una matriz de caracteres, que también es de tipo const, por lo que no se puede modificar.

1.3 Punteros y matrices

        En C, la palabra clave const se puede usar tanto para tipos de puntero como de matriz. Un puntero o una matriz modificados con const significa que el puntero o la matriz en sí no se pueden modificar.

Por ejemplo:

const int arr[5] = {1, 2, 3, 4, 5};

int main() {
    const char* str = "Hello, world!";
    const int* ptr = arr;
   
    return 0;
}

        Aquí, la matriz arr se declara como tipo const int, lo que significa que los elementos de arr no se pueden modificar. El puntero ptr se declara como un tipo const int*, lo que significa que el valor al que apunta ptr no se puede modificar.

2. Uso básico de la palabra clave const en C++

2.1 Declaración e inicialización de variables

En C++, const se puede usar para modificar constantes y variables, por ejemplo:

const double PI = 3.1415926;
const int YEAR = 2021;

void foo() {
    const int x = 10;
    int const y = 20;
}

Tenga en cuenta que las variables const en C++ deben inicializarse inmediatamente y no pueden modificarse.

2.2 Parámetros de función y valores de retorno

En C++, similar a C, const se puede usar para especificar parámetros de función y devolver valores, por ejemplo:

void print(const string& str) {
    cout << str << endl;
}

const char* get_greeting() {
    return "Hello";
}

        Aquí, el parámetro str de la función print se declara como un tipo const string&, lo que significa que str no se puede modificar y también proporciona un mejor rendimiento. El valor de retorno de la función get_greeting es un puntero de tipo const char*, que apunta a una matriz de caracteres, que también es de tipo const, por lo que no se puede modificar.

2.3 Punteros y referencias

        En C++, la palabra clave const se puede usar tanto para tipos de puntero como de referencia. A diferencia de C, en C++, un puntero o una referencia modificada por const no solo significa que el puntero o la referencia en sí no se puede modificar, sino que también significa que el valor al que apunta el puntero o la referencia no se puede modificar.

Por ejemplo:

int n = 10;
const int* ptr = &n;
cout << *ptr << endl; // 输出10
// 下面的代码编译会失败
*ptr = 20;

        Aquí, el puntero ptr se declara como un tipo const int*, lo que significa que el puntero en sí no se puede modificar, y también significa que el valor al que apunta el puntero no se puede modificar. Por lo tanto, si intenta modificar el valor al que apunta el puntero, el compilador informará un error.

3. El papel de const en C y C++

3.1 Proteger los datos de la modificación

        En C y C++, la función principal de const es proteger los datos de la modificación. Use const para evitar errores y agujeros en su código.

Por ejemplo, en el siguiente código:

void foo(char* str) {
    // do some operations on str
    str[0] = 'a';
}

int main() {
    char str[] = "Hello";
    foo(str);
    cout << str << endl;
    return 0;
}

        La función foo acepta un parámetro de puntero de tipo char* y modifica la cadena a la que apunta el puntero. Es fácil cometer errores si la persona que llama pasa accidentalmente una cadena constante o una constante de cadena. Esto se puede evitar usando const.

3.2 Mejorar la legibilidad y el mantenimiento del código

        El uso de la palabra clave const puede mejorar la legibilidad y el mantenimiento de su código. Al leer el código, podemos identificar fácilmente las variables cuyos valores no cambian.

Por ejemplo, en el siguiente código:

const int BUFFER_SIZE = 1024;
void process(const char* str, const int n) {
    char buffer[BUFFER_SIZE];

    // check if n > BUFFER_SIZE
    if (n > BUFFER_SIZE) {
        // 11111
    }

}

        Usar la palabra clave const para definir la constante BUFFER_SIZE y el parámetro n puede hacer que el código sea más claro y fácil de entender.

3.3 Evitar errores potenciales

Se pueden evitar algunos errores potenciales usando la palabra clave const, como:

char* str = "Hello";
str[0] = 'h'; // 这样做是不安全的

        Aquí, str apunta a una constante de cadena, si intenta modificar el valor, dará lugar a resultados impredecibles. El uso de la palabra clave const puede mejorar la seguridad y reducir el riesgo de errores.

4. constante y función

4.1 parámetros de la función const y valores devueltos

        En C y C++, puede usar const para declarar parámetros de función y devolver valores. El uso de un parámetro const en una definición de función evita que la función modifique el parámetro, y el uso de un valor de retorno const evita que se modifique.

Por ejemplo, en C++:

// const函数参数
void print(const string& str) {
    cout << str << endl;
}

// const函数返回值
const char* get_greeting() {
    return "Hello";
}

        Aquí, el parámetro str de la función print es un tipo const string&, lo que significa que el parámetro str no se puede modificar, por lo que print no puede cambiarlo. El valor de retorno de la función get_greeting es de tipo const char*, y el carácter al que apunta el puntero también es de tipo const, lo que significa que no se puede modificar.

4.2 puntero de función constante y puntero de función constante

En C y C++, los punteros de función también se pueden declarar como tipos const, por ejemplo:

void print() {
    cout << "Hello, world!" << endl;
}

// const函数指针
void (* const ptr)() = &print;

// 函数指针常量
void (ptr2)() = &print;
void (const ptr2)() = &print;

        Aquí, tanto el puntero ptr como el puntero ptr2 apuntan a la función print, ptr es un puntero const, que indica que no se puede modificar, y ptr2 es un puntero a una función const, que indica que la función print no se puede modificar.

5. constante y puntero

5.1 puntero const y constante de puntero

        En C y C++, const se puede usar para tipos de puntero. Un puntero const y una constante de puntero son conceptos diferentes:

  • Un puntero const significa que el puntero en sí no se puede modificar, pero los datos en la dirección a la que apunta el puntero se pueden modificar.
  • La constante de puntero significa que la dirección señalada por el puntero no se puede modificar, pero el puntero en sí sí se puede modificar.

Por ejemplo, en el siguiente código:

int n = 10;
const int* ptr1 = &n;    // const指针
int* const ptr2 = &n;    // 指针常量

        Aquí, el puntero ptr1 se declara como un tipo const int*, lo que indica que el puntero en sí mismo es inmutable y también indica que el valor al que apunta el puntero es inmutable. El puntero ptr2 se declara como tipo int* const, lo que significa que la dirección a la que apunta el puntero no se puede modificar, pero sí se puede modificar el valor del propio puntero.

En C++, el modificador const también se puede colocar antes del tipo de puntero o el nombre de la variable, por ejemplo:

int n = 10;
const int* ptr1 = &n;    // const指针
int const* ptr2 = &n;    // 与ptr1等价

En el código anterior, ptr1 y ptr2 son equivalentes, ambos apuntan al tipo const int.

5.2 puntero modificado const y puntero a const

En C y C++, tanto los punteros const como los punteros a const son inmutables.

Por ejemplo, en el siguiente código:

const int n = 10;
const int* ptr1 = &n;    // 指向const的指针
int const* ptr2 = &n;    // 与ptr1等价

En el código anterior, tanto ptr1 como ptr2 apuntan a un puntero de tipo const int, lo que indica que n no se puede modificar.

6. constante frente a clase (solo C++)

En C++, const también se puede usar para variables miembro y funciones miembro de clases.

6.1 variable miembro const y función miembro const

En C++, las variables miembro se pueden declarar const para garantizar que no se puedan modificar:

class Person {
public:
    Person(const char* name, int age): m_name(name), m_age(age) {}
    const string& GetName() const { return m_name; }
    int GetAge() const { return m_age; }
private:
    const string m_name;
    const int m_age;
};

        En el código anterior, las variables miembro m_name y m_age se declaran como tipo const, lo que significa que no se pueden modificar en la clase.

6.2 objetos constantes y referencias constantes

En C++, puede usar la palabra clave const para declarar objetos y referencias, lo que indica que no se pueden modificar. Por ejemplo:

const Person p("Tom", 20);
const Person& rp = p;

        En el código anterior, el objeto p se declara como tipo const, lo que significa que no se puede modificar. Al mismo tiempo, la referencia rp también se declara como un tipo const, lo que significa que el objeto al que se refiere no se puede modificar.

6.3 Puede modificar variables miembro mutables

        Hay otro uso en C++, puede usar la palabra clave mutable para modificar la variable miembro de la clase, incluso en la función miembro const, puede modificar el valor de esta variable. Por ejemplo:

class Person {
public:
    Person(const char* name, int age): m_name(name), m_age(age), m_counter(0) {}
    const string& GetName() const { return m_name; }
    int GetAge() const { return m_age; }
    void Count() const { ++m_counter; }
    int GetCounter() const { return m_counter; }
private:
    const string m_name;
    const int m_age;
    mutable int m_counter;
};

        En el código anterior, la variable miembro m_counter se declara como de tipo mutable, lo que significa que se puede modificar en la función miembro const. Por ejemplo, agregue 1 a m_counter en la función Count, porque m_counter se declara como mutable.

7. La diferencia entre const y C y C++

Aunque C y C++ comparten la misma palabra clave const, existen algunas diferencias en la implementación:

7.1 La diferencia entre const durante la compilación y el enlace

        En C, el compilador generalmente coloca las variables constantes en la memoria de solo lectura, por lo que no se pueden modificar. En C++, las variables constantes se pueden colocar en tablas constantes. Este método de implementación puede producir resultados impredecibles en tiempo de ejecución.

7.2 Diferencias entre variables globales modificadas const y variables estáticas

        En C++, las variables globales modificadas const y las variables estáticas se designan como enlace interno de forma predeterminada. En C, las variables globales modificadas const y las variables estáticas se asignan a un enlace externo de forma predeterminada.

7.3 Diferencias entre constantes de cadena modificadas const

En C, las constantes de cadena pertenecen a matrices de caracteres, es decir:

char str[] = "Hello";

En C++, las constantes de cadena son de tipo char*, a saber:

const char* str = "Hello";

        Estas diferencias pueden causar algunos problemas que quizás deba considerar al usar const en C y C++. Por ejemplo, en el lenguaje C, normalmente es necesario declarar un puntero a una constante de cadena como un tipo const char, mientras que en C++, se usa un tipo const char para declarar una constante de cadena.

Resumen:
        este artículo presenta el uso y las precauciones de la palabra clave const en C y C++. La palabra clave const se puede usar para variables, funciones, punteros y miembros de clase, que pueden proteger los datos de modificaciones, mejorar la legibilidad del código y garantizar la seguridad. Aunque C y C++ comparten las mismas palabras clave, existen algunas diferencias en su implementación. En la programación real, debe elegir el uso constante adecuado según sus necesidades y prestar atención a la diferencia en la implementación entre C y C++.

Supongo que te gusta

Origin blog.csdn.net/crr411422/article/details/131098124
Recomendado
Clasificación