Correção de const
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 os dados sem alterar nada. A palavra-chave const permite impor essa distinção no nível do compilador.
Ao marcar um parâmetro ponteiro como const, você está garantindo que a função não modificará os dados para os quais ele aponta. Se você tentar alterar um membro por acidente, o compilador apresentará 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; // ERRO: não é possível modificar por meio de um 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 aos outros programadores que point_print é um “getter” ou uma operação somente de leitura. Isso é chamado de correção de const: usar const sempre que não for necessária uma modificação.
Esta prática detecta bugs desde o início. 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.
Desafio
FácilVamos criar um módulo Temperature que armazena um valor de temperatura e oferece 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 structTemperaturecom um único membrodouble celsius. Declare também três funções:temp_display: recebe um ponteiroconstpara Temperature e imprime a temperatura atual (somente leitura)temp_adjust: recebe um ponteiro comum para Temperature e uma quantidade do tipo double, depois adiciona essa quantidade a celsius (modificação)temp_to_fahrenheit: recebe um ponteiroconstpara Temperature e retorna o valor convertido para Fahrenheit (somente leitura)
TEMPERATURE_H.temperature.c: Implemente as três funções. A funçãotemp_displaydeve imprimir no formatoCurrent: {celsius}C. A funçãotemp_to_fahrenheitdeve retornarcelsius * 9.0 / 5.0 + 32.0. Lembre-se de que funções que usam ponteirosconstnã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 double) e a quantidade de ajuste (como double).
No seu arquivo principal:
- Inicialize uma
Temperaturecom o valor inicial em Celsius - Chame
temp_displaypara mostrar a temperatura inicial - Chame
temp_adjustpara modificar a temperatura pela quantidade de ajuste - Chame
temp_displaynovamente para mostrar a temperatura atualizada - Imprima a conversão para Fahrenheit usando
temp_to_fahrenheit
Imprima os resultados neste formato:
Current: {celsius}C
Current: {celsius}C
Fahrenheit: {fahrenheit}FUse %.1f para todos os valores de temperatura, exibindo 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.0FExperimente 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 pelo valor de adjustment
// 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;
}
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
1Fundamentos da Programação Modular
Arquivos de cabeçalhoProteções de inclusãoArquivos-fonteFunções estáticasRevisão: calculadora modular4Encapsulamento
Conceito de ponteiros opacosDefinindo structs opacasGetters e settersValidação em settersRevisão: caixa secreta2Objetos e métodos
Structs como objetosO ponteiro 'Self'Correção de constPonteiro vs. valorMétodos auxiliaresRevisão: Gerenciador de pontos5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de vida do objeto
Padrão de construtorPadrão de destrutorInicialização da pilhaCópia profundaRevisão: wrapper de String6Herança por composição
Incorporação de structRegra do primeiro membroAcessando membros do tipo paiUpcastingRevisão: hierarquia de formas9Projeto: Desenhador de Formas
Visão geral do projetoImplementação do círculoImplementação do retânguloUso polimórficoContêiner de formasPratique por conta própria: Compilador de C online