Menu
Coddy logo textTech

Const Correctness

Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 8 de 61.

Ao escrever funções que atuam como métodos, algumas devem modificar o objeto (como player_take_damage), enquanto outras devem apenas ler dados sem alterar nada. A palavra-chave const permite impor essa distinção no nível do compilador.

Ao marcar um parâmetro de ponteiro como const, você está garantindo que a função não modificará os dados para os quais ele aponta. Se você acidentalmente tentar alterar um membro, o compilador produzirá um erro:

typedef struct {
    int x;
    int y;
} Point;

// Esta função só pode LER o ponto
void point_print(const Point *self) {
    printf("(%d, %d)\n", self->x, self->y);
    // self->x = 10;  // ERROR: não é possível modificar através de ponteiro const
}

// Esta função pode MODIFICAR o ponto
void point_move(Point *self, int dx, int dy) {
    self->x += dx;
    self->y += dy;
}

O parâmetro const Point *self informa tanto ao compilador quanto a outros programadores que point_print é uma operação de "getter" ou somente leitura. Isso é chamado de correção de const: usar const sempre que a modificação não for necessária.

Esta prática detecta bugs antecipadamente. Se você escrever uma função de exibição e modificar acidentalmente um campo, o compilador interromperá você imediatamente, em vez de deixar o bug passar para o seu programa.

challenge icon

Desafio

Fácil

Vamos criar um módulo Temperature que armazena um valor de temperatura e fornece operações somente de leitura e de modificação. Isso ajudará você a praticar o uso de ponteiros const para distinguir claramente entre funções que apenas leem dados e aquelas que os alteram.

Você criará três arquivos:

  • temperature.h: Declare uma struct Temperature com um único membro double celsius. Declare também três funções:
    • temp_display: recebe um ponteiro const para Temperature e imprime a temperatura atual (somente leitura)
    • temp_adjust: recebe um ponteiro comum para Temperature e um valor double; em seguida, adiciona o valor a celsius (modificação)
    • temp_to_fahrenheit: recebe um ponteiro const para Temperature e retorna o valor convertido para Fahrenheit (somente leitura)
    Use guardas de inclusão com o símbolo TEMPERATURE_H.
  • temperature.c: Implemente as três funções. A função temp_display deve imprimir no formato Current: {celsius}C. A função temp_to_fahrenheit deve retornar celsius * 9.0 / 5.0 + 32.0. Lembre-se de que funções que usam ponteiros const não podem modificar os dados da struct.
  • main.c: Crie uma Temperature, execute operações e exiba os resultados.

Você receberá duas entradas: o valor inicial em celsius (como um double) e o valor do ajuste (como um double).

No seu arquivo principal:

  1. Inicialize uma Temperature com o valor inicial em celsius
  2. Chame temp_display para exibir a temperatura inicial
  3. Chame temp_adjust para modificar a temperatura pelo valor do ajuste
  4. Chame temp_display novamente para exibir a temperatura atualizada
  5. Imprima a conversão para Fahrenheit usando temp_to_fahrenheit

Imprima os resultados neste formato:

Current: {celsius}C
Current: {celsius}C
Fahrenheit: {fahrenheit}F

Use %.1f para todos os valores de temperatura, a fim de exibir uma casa decimal.

Por exemplo, com um valor inicial de 20.0 e um ajuste de 5.0, a saída seria:

Current: 20.0C
Current: 25.0C
Fahrenheit: 77.0F

Experimente você mesmo

#include <stdio.h>
#include "temperature.h"

int main() {
    double initial_celsius, adjustment;
    scanf("%lf", &initial_celsius);
    scanf("%lf", &adjustment);
    
    // TODO: Crie uma struct Temperature e inicialize-a com initial_celsius
    
    // TODO: Chame temp_display para mostrar a temperatura inicial
    
    // TODO: Chame temp_adjust para modificar a temperatura pela quantidade de ajuste
    
    // TODO: Chame temp_display novamente para mostrar a temperatura atualizada
    
    // TODO: Imprima a conversão para Fahrenheit usando temp_to_fahrenheit
    // Formato: "Fahrenheit: %.1fF\n"
    
    return 0;
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de C online