Você está aqui: C++ ::: Dicas & Truques ::: Ponteiros, Referências e Memória |
Como alocar memória dinâmica usando o operador new do C++Quantidade de visualizações: 12250 vezes |
Em algumas situações precisamos alocar memória dinamicamente. Em C++ isso é feito com o auxílio do operador new. Este operador permite alocar uma determinada quantidade de bytes, alinhados de forma a representar o objeto para o qual queremos reservar memória. Veja um exemplo de código no qual alocamos memória dinâmica para uma variável do tipo int: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- #include <iostream> using namespace std; int main(int argc, char *argv[]){ // aloca memória para um objeto do tipo int int *ponteiro = new int; // vamos definir o valor para o objeto recém-alocado *ponteiro = 20; // vamos exibir seu valor cout << *ponteiro << endl; // vamos liberar a memória delete ponteiro; system("PAUSE"); // pausa o programa return EXIT_SUCCESS; } Note que aqui a memória foi alocada e guardada em um ponteiro. Veja também o uso do operador delete para liberar a memória alocada. Isso evita os vazamentos de memória tão frequentes em aplicações que lidam com a memória dinâmica. É claro que este não é o exemplo mais prático. Qual a vantagem de se alocar memória para um int? Declarar uma variável teria sido mais eficiente. A alocação de memória dinâmica é mais útil quando estamos lidando com objetos mais complexos que os tipos básicos. Alguns exemplos envolvem a criação de objetos de classes, matrizes, estruturas de dados, etc. Veja um exemplo no qual temos uma declaração de uma classe chamada Cliente e em seguida alocamos memória para uma instância desta classe: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- #include <iostream> #include <string> using namespace std; // declaração da classe Cliente class Cliente{ public: Cliente(); string obterNome(); void definirNome(string); private: string nome; }; // implementação dos métodos da classe Cliente::Cliente(){} // construtor vazio // obtém o nome do cliente string Cliente::obterNome(){ return this->nome; } // define o nome do cliente void Cliente::definirNome(string nome){ this->nome = nome; } int main(int argc, char *argv[]){ // aloca memória para um objeto da classe Cliente Cliente *c = new Cliente(); // vamos definir o nome do cliente c->definirNome("Osmar J. Silva"); // vamos exibir o nome do cliente cout << c->obterNome() << endl; // vamos liberar a memória usada delete c; system("PAUSE"); // pausa o programa return EXIT_SUCCESS; } Ao executar este código C++ nós teremos o seguinte resultado: Nome do cliente: Osmar J. Silva |
![]() |
C++ ::: Win32 API (Windows API) ::: Arquivos e Diretórios |
Como renomear arquivos e diretórios em C++ usando a função MoveFile() da API do WindowsQuantidade de visualizações: 8692 vezes |
A função MoveFile() da API do Windows pode ser usada quando precisamos renomear um arquivo ou diretório. Veja seu protótipo:BOOL WINAPI MoveFile( LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName ); Note que só precisamos fornecer o nome atual e o novo nome do arquivo ou diretório que queremos renomear. Se houver algum erro ao renomear o arquivo ou diretório, a função MoveFile() retornará o valor 0 (zero). Se a operação for efetuada com sucesso, um valor diferente de 0 (zero) será retornado. É sempre uma boa idéia usar a função GetLastError() para retornar o código do erro em caso de falha. Veja um trecho de código no qual renomeamos um arquivo: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- #include <cstdlib> #include <iostream> #include <windows.h> using namespace std; int main(int argc, char *argv[]){ // nome atual do arquivo CHAR nome_atual[] = "C:\\testes.txt"; // novo nome do arquivo CHAR nome_novo[] = "C:\\novo.txt"; // vamos renomear o arquivo if(MoveFile(nome_atual, nome_novo)){ cout << "Arquivo renomeado com sucesso." << endl; } else{ cout << "Erro ao renomear o arquivo: " << GetLastError() << endl; } system("PAUSE"); return EXIT_SUCCESS; } Aqui nós estamos alterando o nome do arquivo testes.txt para novo.txt. Os possíveis erros nesta operação são: a) ERROR_FILE_NOT_FOUND - Ocorre quando o arquivo fornecido como primeiro argumento para a função MoveFile() não existe. O código para este erro é 2 e a mensagem em português é "O sistema não pode encontrar o arquivo especificado (The system cannot find the file specified)". b) ERROR_ALREADY_EXISTS - Ocorre quando o arquivo fornecido como segundo argumento para a função MoveFile() já existe. O código para este erro é 183 e a mensagem em português é "Não é possível criar um arquivo já existente (Cannot create a file when that file already exists)". Veja agora um trecho de código no qual renomeamos um diretório: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- #include <cstdlib> #include <iostream> #include <windows.h> using namespace std; int main(int argc, char *argv[]){ // nome atual do diretório CHAR nome_atual[] = "C:\\imagens"; // novo nome do diretório CHAR nome_novo[] = "C:\\imagens2"; // vamos renomear o diretório if(MoveFile(nome_atual, nome_novo)){ cout << "Diretório renomeado com sucesso." << endl; } else{ cout << "Erro ao renomear o diretório: " << GetLastError() << endl; } system("PAUSE"); return EXIT_SUCCESS; } |
C++ ::: Fundamentos da Linguagem ::: Tipos de Dados |
Como usar o tipo de dados long ou long int da linguagem C++Quantidade de visualizações: 22397 vezes |
O tipo de dados long (também chamado de long int) da linguagem C++ é uma variação do tipo int e geralmente possui a mesma capacidade de armazenamento deste. Nós o usamos quando queremos representar números inteiros, ou seja, sem partes fracionárias, assim como int. É importante verificar se o seu compilador trata int e long da mesma forma. Veja um trecho de código demonstrando o uso deste tipo (note que estes estudos foram feitos no Windows XP - 32 bits - usando Dev-C++):---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- #include <iostream> using namespace std; int main(int argc, char *argv[]){ // declara uma variável do tipo long long quant = 590; cout << "Quantidade: " << quant << "\n\n"; system("PAUSE"); // pausa o programa return EXIT_SUCCESS; } Veja que a maioria dos compiladores C++ não faz distinção entre os tipos long e long int. A capacidade de armazenamento do tipo long depende da arquitetura na qual o programa está sendo executado. Uma forma muito comum de descobrir esta capacidade é usar os símbolos LONG_MIN e LONG_MAX, definidos no header climits (limits.h). Veja: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- #include <iostream> using namespace std; int main(int argc, char *argv[]){ cout << "Valor mínimo: " << LONG_MIN << "\n"; cout << "Valor máximo: " << LONG_MAX << "\n\n"; system("PAUSE"); // pausa o programa return EXIT_SUCCESS; } Ao executar este programa você terá um resultado parecido com: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- Valor mínimo: -2147483648 Valor máximo: 2147483647 Veja que o tipo long aceita valores positivos e negativos. Tudo que você tem a fazer é tomar todo o cuidado para que os valores atribuidos a variáveis deste tipo não ultrapassem a faixa permitida. Veja um trecho de código que provoca o que chamamos de transbordamento (overflow): ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- #include <iostream> using namespace std; int main(int argc, char *argv[]){ long soma = LONG_MAX + 2; cout << "Resultado: " << soma << "\n"; system("PAUSE"); // pausa o programa return EXIT_SUCCESS; } Este programa exibirá o seguinte resultado: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- Resultado: -2147483647 Note que este não é o resultado esperado, visto que LONG_MAX + 2 deveria retornar: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- 2147483647 + 2 = 2147483649 Porém, como o valor máximo que pode ser armazenado em um long é 2147483647, o procedimento adotado pelo compilador foi tornar o número negativo e subtrair 1. É claro que, se você testar este código em arquiteturas diferentes o resultado poderá ser diferente do exemplificado aqui. Em termos de bytes, é comum o tipo long ser armazenado em 4 bytes, o que resulta em 32 bits (um byte é formado por 8 bits, lembra?). Veja um trecho de código que mostra como usar o operador sizeof() para determinar a quantidade de bytes necessários para armazenar um variável do tipo long: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- #include <iostream> using namespace std; int main(int argc, char *argv[]){ cout << "Tamanho de um long: " << sizeof(long) << " bytes\n\n"; system("PAUSE"); // pausa o programa return EXIT_SUCCESS; } O resultado da execução deste código será algo como: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- Tamanho de um long: 4 bytes |
C++ ::: Desafios e Lista de Exercícios Resolvidos ::: Laços |
Exercício Resolvido de C++ - Escreva um programa em C++ para ler dois números inteiros M e N e, a seguir, imprimir os números paresQuantidade de visualizações: 570 vezes |
Pergunta/Tarefa: Escreva um programa em C++ para ler dois números inteiros M e N e, a seguir, imprimir os números pares existentes no intervalo [M, N] e imprimir a multiplicação desses números (os pares). Observe que os valores M e N devem ser fornecidos pelo usuário. Nota: por se tratar de intervalo fechado [M, N], os números M e N devem ser incluídos na amostra. Além disso, seu código deve assegurar que M seja menor que N. Sua saída deverá ser parecida com: Informe o valor de M: 3 Informe o valor de N: 9 Números pares no intervalo [M, N]: 4, 6, 8, Multiplicação dos números pares no intervalo [M, N]: 192 Veja a resolução comentada deste exercício em C++: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- #include <string> #include <iostream> using namespace std; int main(int argc, char *argv[]){ // variáveis usadas na resolução do problema int m, n, i, multiplicacao = 1; // vamos pedir para o usuário informar os valores de M e N cout << "Informe o valor de M: "; cin >> m; cout << "Informe o valor de N: "; cin >> n; // M é menor que N? if(m >= n){ cout << "M deve ser menor que N"; } else{ // mostra os números pares no intervalo cout << "Números pares no intervalo [M, N]: "; for(i = m; i <= n; i++){ if(i % 2 == 0){ cout << i << ", "; // aproveitamos para calcular a multiplicação dos números // pares no intervalo informado multiplicacao = multiplicacao * i; } } // mostramos a multiplicação cout << "\nMultiplicação dos números pares no intervalo [M, N]: " << multiplicacao << endl; } cout << "\n\n"; system("PAUSE"); // pausa o programa return EXIT_SUCCESS; } |
Mais Desafios de Programação e Exercícios e Algoritmos Resolvidos de C++ |
Veja mais Dicas e truques de C++ |
Dicas e truques de outras linguagens |
Códigos Fonte |
![]() Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais |
![]() Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais |
Linguagens Mais Populares |
1º lugar: Java |