Arquivo da categoria ‘C/C++’

O que é um BOM programa?

Publicado: 18 de fevereiro de 2014 em Abap, C#, C/C++, Java, Python

Utilize Melhores praticas

Melhores práticas é uma expressão derivada do inglês best practices que denomina as técnicas identificadas como as melhores em termos de eficácia, eficiência e reconhecimento de valor para os envolvidos e afetados direta e ou indiretamente na realização de determinadas tarefas, atividades, procedimentos, ou até mesmo, na realização de um conjunto de tarefas, atividades, procedimentos devidamente agrupados ou integrados por um objetivo comum.

Best Pratices:

Sap: https://help.sap.com/bestpractices

Oracle: http://www.oracle.com/us/support/best-practices/overview/index.html?ssSourceSiteId=otnru

Microsoft: http://msdn.microsoft.com/en-us/library/ms184412(v=vs.110).aspx

Python: http://www.python.org/dev/peps/pep-0008/

Leia os White Papers de suas Ferramentas

Um White Paper ou, em português, “Livro branco” ou “Relatório Branco”, é um documento oficial publicado por um governo ou uma organização internacional, a fim de servir de informe ou guia sobre algum problema e como enfrentá-lo. Os “White Paper” são utilizados para educar os leitores e ajudar as pessoas a tomar decisões. São usados na política e nos negócios. Também podem ser um informe governamental que descreve uma política, geralmente, a longo prazo.

White Papers:

Sap: http://scn.sap.com/docs/DOC-17149

Java: http://www.oracle.com/technetwork/java/javase/documentation/whitepapers-jsp-139357.html

Microsoft: http://technet.microsoft.com/en-us/library/cc736902(v=ws.10).aspx

Python: http://www.deitel.com/Default.aspx?tabid=768

Design Pattern

Em engenharia de software, design pattern é uma solução reutilizável geral para um problema que comumente ocorre dentro de um determinado contexto em design de software. Um design pattern não é um projeto acabado que pode ser transformado diretamente em fonte ou código de máquina. É uma descrição ou modelo de como resolver um problema que pode ser utilizado em diversas situações diferentes. Os padrões são formalizadas as melhores práticas que o programador deve implementar na aplicação.

Design Pattern:

Sap: http://wiki.scn.sap.com/wiki/display/ABAP/ABAP+Objects+Design+Patterns+-+Singleton

Oracle: http://www.oracle.com/webfolder/ux/applications/DPG/OBIEE/patterns/index.html

Microsoft: http://msdn.microsoft.com/library/cc467894.aspx

Python: http://www.python.org/workshops/1997-10/proceedings/savikko.html

Um bom programa

Correto / sem erros.

Fácil de entender.

Fácil de modificar / ampliar.

Bom desempenho (velocidade).

Consistência

Escrever código de forma consistente torna mais fácil escrever e entender.

Guia de “estilo” Programação :

  • Definir regras sobre como fazer as coisas .
  • Diretrizes de estilo “padrão” tem sido amplamente aceita.

Variáveis​​:

substantivos (Primeira letra minúscula, palavras subsequentes maiúscula).

ex: x, forma, altaPontuação, arquivoNome.

Métodos:

verbos (Primeira letra minúsculas palavras subsequentes maiúsculas).

ex: getSize (), desenhe (), desenheComCor ()

Classes:

substantivos (Primeira letra maiúscula )

ex: Forma, PaginaDaWeb, EnderecoEmail.

Melhor Design de Classe

  • Uma boa classe  é fácil de entender e usar.
  • Escreva campos e métodos privados por padrão.
  • Só escreva métodos público, se você precisar.
  • Se você precisar de acesso a um campo, escreva um Metodo:   public int GetBar () {return bar;}

Depuração (Debugging)

O processo de encontrar e corrigir um erro em um programa

Uma habilidade fundamental na programação

Bom Desenvolvimento em 6 Passos

Passo 1: Não cometer erros

  • Não introduzir erros em primeiro lugar.
  • Reutilização: encontrar o código existente que faz o que você quer.
  • Projeto: pense antes de escrever um código.
  • Melhores Práticas: procedimentos recomendados / técnicas para evitar problemas comuns.

Desing Pseudocódigo

Um alto nível, descrição compreensível do que o programa supostamente faz.

Não se preocupe com os detalhes, se preocupe com a estrutura.

Desing

  • Design visual de objetos, ou como o programa funciona.
  • Não se preocupe com notação específica, basta fazer algo que faça sentido para você.
  • Racunhar em um pedaço de papel é útil.

desenho

Passo 2: Encontre erros no início

Mais fácil corrigir os erros quanto mais cedo você encontrá-los.

  • Teste o seu projeto.
  • Use ferramentas para detectar possíveis erros.
  • Teste a sua implementação.
  • Confira seu trabalho.

Teste: Entradas importantes

Confira todos os “caminhos” através do programa.

Pense em um exemplo para cada um “caminho”.

Warnings (Compilador)

Ferramentas: Avisos (Advertências).

  • Advertências: pode não ser um erro, mas trate como se fosse.
  • Sugestão: sempre corrigir todos os avisos.
  • Verificações extras: encontrar bugs e ferramentas relacionadas.
  • O teste de unidade: Ferramentas facilitam o teste de unidade.

Passo 3: reproduzir o erro

  • Descobrir como reproduzir o erro.
  • Criar um caso de teste mínimo.
  • Volte para a versão de trabalho, e introduza mudanças uma de cada vez até que o erro desapareça.
  • Elimine o material extra que não é usado.

Passo 4: Gerar Hipótese

  • O que está acontecendo de errado?
  • O que pode estar causando o erro?
  • Questionar suas premissas: “possivelmente não pode ser  X”.
  • E se é, devido a alguma outra coisa?

Passo 5: coletar informações

  • Se x é o problema, como você pode verificar?
  • Precisa de informações sobre o que está acontecendo dentro do programa.

Passo 6: Examinar dados

  • Examine seus dados A sua hipótese está correta?
  • Corrigir o erro, ou gerar uma nova hipótese.

API – TreeSet, Set, SortedList – Java +, C++, C#

Publicado: 17 de fevereiro de 2014 em C#, C/C++, Java

O que é API?

Application Programming Interface (ou Interface de Programação de Aplicativos) é um conjunto de rotinas e padrões estabelecidos por um software para a utilização das suas funcionalidades por aplicativos que não pretendem envolver-se em detalhes da implementação do software, mas apenas usar seus serviços.

De modo geral, a API é composta por uma série de funções acessíveis somente por programação, e que permitem utilizar características do software menos evidentes ao utilizador tradicional.

Por exemplo, programas de desenho geométrico possuem uma API específica para criar automaticamente gráficos geométricos de acordo com padrões definidos pelo utilizador.

Introdução a API

Uma linguagem de programação é um método padronizado para comunicar instruções para um determinado hardware. As grandes empresas de tecnologia desenvolvem hardware e também desenvolvem linguagens de programação para que seu hardware possa ser controlado de um modo mais fácil e amigável do que linguagem de maquina.

Como a evolução do hardware as linguagens de programação também foram evoluindo, empresas começaram a disputar tecnologia de desenvolvimento de novos hardwares e esta historia é recheada de brigas por suas respectivas patentes, um exemplo de grandes disputas judiciais entre empresas que escrevem linguagens de programação foi a Oracle x Google, a  Oracle detentora das patentes do Java  e a Google criadora do sistema operacional Android, que usa Java (API) como parte do seu sistema operacional e base para a programação de softwares da plataforma Android.

  • A maioria os softwares voltados para desenvolvedores possuem sua própria API.
  • As APIs são usualmente específicas para uma determinada tecnologia.
  •  Um framework pode ser baseado em várias bibliotecas de aplicação e  várias APIs.
  • Uma API também pode ser uma implementação de um protocolo.
  • Uma API pode ser desenvolvida para um grupo restrito de utilizadores, ou ela pode ser liberada para o público.
  •  A prática de publicação de APIs permitiu comunidades na web criar uma arquitetura aberta para a partilha de conteúdos e dados entre as comunidades e aplicações.
  • A Microsoft tem mostrado um forte compromisso com uma API compatível com versões anteriores, especialmente dentro de sua biblioteca API do Windows (Win32).
  • A Microsoft tornou as APIs Microsoft Windows publicas.
  • A Apple lança suas APIs Carbon e Cocoa, para que softwares possam ser escrito para suas plataformas.
  • A Sony faz de suas API oficiais para PlayStation disponível apenas para desenvolvedores PlayStation licenciados.

Tipos de APIs – Coleções

Existem vários tipos de APIs, neste post especificamente vamos utilizar APIs chamadas de Containers ou Collections, estas APIs fornecem varias funções para se criar uma coleção de objetos e manipula-los de forma enumerada. A Coleção mais famosa no mundo da orientação a objeto é pertencente a biblioteca para C++ chamada STANDARD TEMPLATE LIBRARY, as coleção pertencentes ao JCF (Java Collection Framework) ou Generic Collections (.NET Framework) foram baseadas na STL para C++.

Diferenças entre APIs

Aqui vamos programar com uma API Java que possui sua equivalência na linguagem C++, mas não possui equivalência na linguagem .NET C#, para usar esta API em desenvolvimento Windows é necessário usar a própria API Java(Oracle), usando a linguagem J#, que permite usar Java na plataforma .NET. Para C# usaremos uma API compatível.

.NET J#: http://msdn.microsoft.com/en-us/library/aa986696(v=vs.80).aspx

Utilizando API

TreeSet  – Java

Uma classe que representa um conjunto classificado de elementos. Os elementos são classificados usando o comparador fornecido através de construtor ou usando os métodos de interface comparáveis ​​implementadas pelos elementos.

Pacote: java.util

set  – C++

O conjunto de classe container STL é usado para o armazenamento e recuperação de dados de uma coleção em que os valores dos elementos contidos são únicos e servem como os valores de chave de acordo com a qual os dados são automaticamente ordenados. O valor de um elemento em um conjunto não pode ser alterado diretamente. Em vez disso, você deve excluir valores antigos e inserir elementos com novos valores.

Include: <set>

SortedList – C#

Representa uma coleção de pares de chave / valor que são classificados por chaves e são acessíveis por chave e por índice.

Namespace: System.Collections

Exemplo:

Neste exemplo utilizaremos três APIs diferentes em linguagens diferentes para criar o mesmo programa, uma lista ordenada de bandas de rock dos anos 60, fica como nota, que a linguagem C# não possui uma API equivalente então vamos utilizar uma outra API compatível,  Para usar a API equivalente em .NET é necessário utilizar a linguagem J# que utiliza as patentes da Oracle.

Java

package org.desenvolvimentoaberto;

import java.util.TreeSet;

  public class Arvore {

  public static void main(String[] args) {

  TreeSet<String> paradas = new TreeSet<>();

  paradas.add("Beatles");
  paradas.add("Rolling Stones");
  paradas.add("The Doors");
  paradas.add("Jefferson Airplane");
  paradas.add("The Who");

  System.out.println("TOP " +  paradas.size() + " Anos 60");
  System.out.println();

  System.out.println("Primeiro Lugar: " + paradas.first());

  System.out.println("Ultimo Lugar: " + paradas.last());
  System.out.println();

  System.out.println("Cai uma posição: " + paradas.last());

  paradas.remove(paradas.last());  paradas.add("Beach Boys");

  System.out.println("Sobe " + paradas.size() + " posições: " + paradas.first());
  System.out.println();

  System.out.println("Paradas Anos 60:");

  for (String s : paradas)
  {
     System.out.println(s);
  }
 }
}

C++

#include "stdafx.h"
#include <iostream>
#include <string>
#include <set>

using namespace std;

int _tmain(int argc, _TCHAR* argv[]) {

  set <string> paradas;
  set <string>::iterator primeiroI;
  set <string>::iterator ultimoI;
  set <int>::size_type quantidadeI;

  paradas.insert("Beatles");
  paradas.insert("Rolling Stones");
  paradas.insert("The Doors");
  paradas.insert("Jefferson Airplane");
  paradas.insert("The Who");

  primeiroI = paradas.begin();
  ultimoI = paradas.end();
  ultimoI--;
  quantidadeI = paradas.size();

  cout << "TOP " << quantidadeI << " Anos 60" << endl;  cout << endl;
  cout << "Primeiro Lugar: " << *primeiroI << endl;
  cout << "Ultimo Lugar: " <<  *ultimoI << endl;

  cout << endl;

  ultimoI = paradas.end();
  ultimoI--;

  cout << "Cai uma posicao: " << *ultimoI << endl;

  paradas.erase(*ultimoI);
  paradas.insert("Beach Boys");

  primeiroI = paradas.begin();
  quantidadeI = paradas.size();

  cout << "Sobe " << quantidadeI << " posicoes: " << *primeiroI << endl;
  cout << endl;

  cout << "Paradas Anos 60:" << endl;

  for (auto i : paradas)
  {
   cout << i << endl;
  }

  system("pause");
  return 0;
 }

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;

namespace DesenvolvimentoAberto {

class Program
{
  static void Main(string[] args)
  {
    SortedList paradas = new SortedList();

    paradas.Add("Beatles","");
    paradas.Add("Rolling Stones","");
    paradas.Add("The Doors","");
    paradas.Add("Jefferson Airplane","");
    paradas.Add("The Who","");

    Console.WriteLine("TOP " +  paradas.Count + " Anos 60");
    Console.WriteLine();

    Console.WriteLine("Primeiro Lugar: " + paradas.GetKey(0));
    Console.WriteLine("Ultimo Lugar: " + paradas.GetKey(paradas.Count -1));
    Console.WriteLine();

    Console.WriteLine("Cai uma posição: " + paradas.GetKey(paradas.Count - 1));

    paradas.Remove(paradas.GetKey(paradas.Count - 1));

    paradas.Add("Beach Boys","");

    Console.WriteLine("Sobe " + paradas.Count + " posições: " +  paradas.GetKey(0));
    Console.WriteLine();

    Console.WriteLine("Paradas Anos 60:");

    for (int i = 0; i < paradas.Count; i++)
    {
       Console.WriteLine(paradas.GetKey(i));
    }

    Console.ReadKey();
   }
  }
}

Classes – Inheritance e Override – C++

Publicado: 16 de fevereiro de 2014 em C/C++

Inheritance (herança)

Programação orientada a objetos permite que classes possam herdar estados e comportamentos comuns usados de outras classes. Neste exemplo, bicicleta torna-se agora a superclasse de MountainBike. Na linguagem de programação, cada classe é permitido ter uma superclasse direta, e cada superclasse tem o potencial para um número ilimitado de subclasses.

Na herança, a classe derivada contém os membros da classe base acrescido de quaisquer novos membros adicionados. Como resultado, uma classe derivada pode se referir a membros da classe base (a não ser se os membros forem redefinidos na classe derivada). O operador de escopo resolução (::) pode ser usado para se referir a membros de classes base, diretos ou indiretos, quando os membros foram redefinidos na classe derivada.

Tipos de Heranças

A linguagem de programação C++ possui dois tipos de herança.

Simples:

Em “herança simples” uma forma comum de herança, as classes têm apenas uma classe base.

Múltiplas:

A nova versão do C + + introduziu um modelo de “herança múltipla”. Num gráfico de múltiplas heranças, as classes de derivados podem ter multiplos números de classes de bases diretas ou seja a classe AB deriva da classa A e de uma outra classe B.

Override

Métodos Override (substituição), em programação orientada a objeto, é um recurso de linguagem que permite que uma subclasse ou classe filha possa fornecer uma implementação específica de um método que já é fornecido por uma de suas superclasses ou classes pai.

A implementação Override das subclasses substitui a implementação na superclasse, fornecendo um método que tem o mesmo nome, mesmos parâmetros ou assinatura, e mesmo tipo de retorno como o método na classe pai.

Exemplo:

Neste exemplo damos a classe MountainBike todos os mesmos campos e métodos da classe bicicleta, e ainda permite que seu código se concentre exclusivamente sobre as características que a tornam única. Isso faz do código de suas subclasses fáceis de ler. Usamos metodos Override neste exemplo de duas maneiras, para substituir um método da subclasse e adicionar mais um construtor com parametros.

No entanto, você deve tomar cuidado para documentar corretamente o estado e o comportamento que cada superclasse define, uma vez que o código não irá aparecer no arquivo de origem de cada subclasse.

C++

Classe #1 – Principal.cpp

#include "stdafx.h"
#include <iostream>
#include <string>
#include "bicicleta.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
 {

// Metodo com Construtor Default
  Bicicleta bike1;
  bike1.modelo = "ZR069";
  bike1.quadro = "Ferro";
  bike1.rodas = "Ferro";
  bike1.freios = "Pastilhas";
  bike1.bicicleta();

  cout << endl;

  // Construtor Override

  Bicicleta bike2("XA 200", "Aluminio", "Pastilhas", "Aluminio");
  bike2.bicicleta();

  cout << endl;

// Herança - Montain Bike
  BicicletaMontanha  bike3;
  bike3.modelo = "Attack 500";
  bike3.quadro = "Fibra de Carbono";
  bike3.rodas = "Aluminio";
  bike3.freios = "Disco";
  bike3.amortecedores = "R3000";
  bike3.garrafa = "Aluminio 500ml";
  bike3.marchas = "18 Velocidades";
  bike3.gps = "Discovery 2.5";

// Metodo Override

  bike3.bicicleta();
  system("pause");
  return 0;

}

Classe #2 – Bicicleta.h

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

class Bicicleta
 {
 public:
   string modelo;
   string quadro;
   string freios;
   string rodas;

// Construtor Default
   Bicicleta()   {}

// Construtor Override

  Bicicleta(string bmodelo, string bquadro, string bfreios, string brodas)
  {
   modelo = bmodelo;
   quadro = bquadro;
   rodas  = brodas;
   freios = bfreios;
  }

void bicicleta()
  {
   cout << " Bicicleta:" + modelo << endl;
   cout << " Quadro:" + quadro << endl;
   cout << " Rodas:" + rodas << endl;
   cout << " Freios:" + freios << endl;
  }

};

class BicicletaMontanha : public Bicicleta
 {
 public:
   string marchas;
   string amortecedores;
   string garrafa;
   string gps;

//Metodo Override

void bicicleta()
  {
   cout << " Bicicleta:" + modelo << endl;
   cout << " Quadro:" + quadro << endl;
   cout << " Rodas:" + rodas << endl;
   cout << " Freios:" + freios << endl;
   cout << " Marchas:" + marchas << endl;
   cout << " Amortecedores:" + freios << endl;
   cout << " Garrafa:" + garrafa << endl;
   cout << " Gps:" + gps << endl;
  }
   BicicletaMontanha()
  {
  }

};

Namespaces – C++

Publicado: 15 de fevereiro de 2014 em C/C++

A palavra-chave namespace é usada para declarar um escopo que contém um conjunto de objetos relacionados.  Você pode usar um namespace para organizar elementos de código e para criar globalmente tipos exclusivos.

namespaces, ao contrário de classes, não requerem instanciação, você não precisa de um objeto para usar um namespace específico. Você só precisa prefixar a função que você deseja chamar com namespace_name ::  semelhante à forma como você chamaria uma função de um membro estático de uma classe.

Outra conveniência de namespaces é que eles permitem que você use o mesmo nome da função, quando faz sentido fazê-lo, para executar várias ações diferentes

Namespaces podem ser usados ​​para estruturar um programa em “unidades lógicas”. Os namespaces funcionam da mesma forma que setores de uma empresa, dentro de um namespace você pode incluir todas as funções necessárias para cumprir um determinado objetivo. Por exemplo, se você tiver um programa que se conecte à Internet, você pode ter um namespace para lidar com todas as funções de conexão.

Mais informações sobre namespaces C++ você encontra aqui.

Exemplos:

C++

Cpp #1 – Principal

#include "stdafx.h"
#include <iostream>
#include <string>
#include "menssagem.h"

using namespace std;
using namespace Menssagem;

int _tmain(int argc, _TCHAR* argv[])
 {
  menssagem("Estou usando o namespace menssagem");
  menssagem("namespaces em C++ não necessitam instancias");
  menssagem("Desenvolvimento Aberto - C++");
system("pause");
return 0;
 }

.h #1 – Menssagem

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

namespace Menssagem
 {
  void menssagem(string msg)
  {
   cout << msg << endl;
  }

}

Condição – Case e Switch – Java, C++, C# e Abap

Publicado: 14 de fevereiro de 2014 em Abap, C#, C/C++, Java

A instrução CASE como o IF também é um comando clássico e existe em muitas linguagens de programação, seja ela compilada ou interpretada. O comando Case predominou por muitos anos e nos tempos atuais ganhou uma nova cara e um novo nome apesar de permanecer com a mesma estrutura, o SWITCH. Comando CASE ainda é usado nos dias atuais por varias linguagens de programação e linguagens de scripts entre elas o ABAP, PL/SQL, TRANSACT-SQL e outras.

A instrução CASE e SWITCH é como uma série de instruções IF, apenas usando a palavra-chave WHEN (Quando) ou CASE (Caso). A instrução é avaliada a partir de cima para baixo. Se a condição for verdadeira, então correspondente a cláusula é executado e execução salta para o fim do caso (avaliação curto-circuito).

Ou seja ao contrário de if-then e declarações if-then-else, a instrução switch pode ter um número de possíveis caminhos de execução. Um switch funciona com o byte, short, char, e tipos primitivos de dados int. Ele também funciona com tipos enumerados, a classe String, e algumas classes especiais que envolvem certos tipos primitivos: Character, Byte, Short, e Integer.

Exemplo:

Neste simples exemplo podemos ver como mostrar na tela o dia da semana usando um numero de 1 a 7.

Java

public class Caso {

public static void main(String[] args)
 {
      int dia = 5;
     switch (dia)
   {
       case 1:
      System.out.println("Segunda");
    break;
          case 2:
       System.out.println("Terça");
    break;
           case 3:
       System.out.println("Quarta");
    break;
           case 4:
       System.out.println("Quinta");
    break;
          case 5:
       System.out.println("Sexta");
    break;
          case 6:
       System.out.println("Sabado");
    break;

    default:
       System.out.println("Domingo");
    break;
  }

}

}

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication55
 {
     class Program
     {
         static void Main(string[] args)
         {
              int dia = 5;
     switch (dia)
   {
       case 1:
      Console.WriteLine("Segunda");
    break;
          case 2:
       Console.WriteLine("Terça");
    break;
           case 3:
       Console.WriteLine("Quarta");
    break;
           case 4:
       Console.WriteLine("Quinta");
    break;
          case 5:
       Console.WriteLine("Sexta");
    break;
          case 6:
       Console.WriteLine("Sabado");
    break;

   default:
   Console.WriteLine("Domingo");
   break;
  }

   Console.ReadKey();
         }
     }
 }

C++

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
 {
  int dia = 5;

switch (dia)
  {
  case 1:
   cout << "Segunda" << endl;
   break;

case 2:
   cout << "Terça" << endl;
   break;

case 3:
   cout << "Quarta" << endl;
   break;

case 4:
   cout << "Quinta" << endl;
   break;

case 5:
   cout << "Sexta" << endl;
   break;

case 6:
   cout << "Sabado" << endl;
   break;

default:
   cout << "Domingo" << endl;
   break;
  }
  system("pause");
  return 0;
 }

ABAP

*&---------------------------------------------------------------------*
*& Report  ZCASO
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Caso
*&---------------------------------------------------------------------*
REPORT  ZCASO.

DATA dia TYPE i.

dia = 5.

CASE dia.

WHEN 1.
               WRITE : / 'Segunda'.

WHEN  2.
               WRITE : / 'Terça'.

WHEN  3.
               WRITE : / 'Quarta'.

WHEN  4.
               WRITE : / 'Quinta'.

WHEN  5.
               WRITE : / 'Sexta'.

WHEN  6.
               WRITE : / 'Sabado'.

WHEN OTHERS.
               WRITE : / 'Domingo'.
ENDCASE.

Classes – Escopos – Java, C++ e C#

Publicado: 14 de fevereiro de 2014 em C#, C/C++, Java

Escopo refere-se à vida e acessibilidade de uma variável. Quão grande é o alcance depende de onde uma variável é declarada. Por exemplo, se uma variável é declarada na parte superior de uma classe, ela será acessível a todos os métodos de classe. Se for declarada num método, em seguida, só pode ser utilizada em tal método.

O escopo de uma variável é a parte do programa que pode acessar uma variável. Quando você tenta acessar uma variável que não está no escopo, você normalmente tém um erro do compilador. Aqui estão algumas das regras de escopo:

  1. Variáveis ​​de classe (campos estáticos) estão no escopo em todos os lugares na classe.
  2. Se uma variável de classe é declarada “pública”, está no escopo em todas as classes.
  3. As variáveis ​​de instância (campos não-estáticos) estão no escopo em métodos não estáticos chamados em um objeto apropriado.
  4. As variáveis ​​e parâmetros locais estão no escopo apenas dentro do método que os declarou.

Exemplo:

Neste exemplo veremos o alcance do escopo das variáveis estáticas, publicas e privadas em sua classe. Na classe principal vemos o resultado do escopo utilizado na classe planeta.

As variáveis privadas podem ser utilizadas somente dentro da classe planeta, a variável publica pode ser utilizada por todas as classes ou neste caso pelo objeto, a variável estática é utilizada globalmente e não precisa ser instanciada, todos os objeto que você criar, ou seja outros planetas irão compartilhar os dados desta variável, as variáveis locais criadas dentro do construtor só podem ser utilizadas dentro do método em que foi criada.

Criamos o objeto da classe planeta chamado Marte, experimente criar outros objetos com nome de planetas e imprima seus valores.

Java

Classe #1 – Principal

public class principal {

public static void main(String[] args)
  {
      Planetas marte = new Planetas(3.0, 1.5, 6.419e23);

      marte.apelido = "Marte";

      System.out.println("Quantidade de planetas: " + Planetas.numeroDePlanetas);
      System.out.println("Nome do Planeta: " + marte.apelido);
      System.out.println("As outras variaveis da classe não podem ser alcançadas devido ao escopo");
      System.out.println("mas podem ser utlizadas dentro da classe");
  }
 }
 

Classe #2 – Planetas

public class Planetas {

 // Variavel da classe é compartilhada por todos
 public static long numeroDePlanetas;

 // Variavel de intancias
 private double x, y;
 private double massa;
 public String apelido;

      // Construtor
      //  x e y são  variaveis instanciadas,
      //  mas newX and newY são variaveis locais
      //  O construtor incrementa o valor
    public  Planetas(double novoX, double novoY, double novaMassa)
    {
       x = novoX;
       y = novoY;

       massa = novaMassa;
       numeroDePlanetas++;
    }
}

C#

Classe #1 – Principal

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication53  {
      class Program
      {
          static void Main(string[] args)
          {
              Planetas marte = new Planetas(3.0, 1.5, 6.419e23);

              marte.apelido = "Marte";

              Console.WriteLine("Quantidade de planetas: " + Planetas.numeroDePlanetas);
              Console.WriteLine("Nome do Planeta: " + marte.apelido);
              Console.WriteLine("As outras variaveis da classe não podem ser alcançadas devido ao escopo");
              Console.WriteLine("mas podem ser utlizadas dentro da classe");

              Console.ReadKey();
          }
      }
  }

Classe #2 – Planetas

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication53 {

public class Planetas {

         // Variavel da classe é compartilhada por todos
          public static long numeroDePlanetas;

         // Variavel de intancias
          private double x, y;
          private double massa;
          public String apelido;

          // Construtor
          //  x e y são  variaveis instanciadas,
          //  mas newX and newY são variaveis locais
          //  O construtor incrementa o valor

          public Planetas(double novoX, double novoY, double novaMassa)
          {
              x = novoX;
              y = novoY;

              massa = novaMassa;
              numeroDePlanetas++;
          }
    }
} 

C++

Classe #1 – Principal

#include "stdafx.h"
#include <iostream>
#include <string>
#include "planetas.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])  {

   Planetas marte(3.0, 1.5, 6.419e23);

   marte.apelido = "Marte";

   cout << "Quantidade de planetas: " << marte.numeroDePlanetas << endl;
   cout << "Nome do Planeta: " << marte.apelido << endl;
   cout << "As outras variaveis da classe não podem ser alcançadas devido ao escopo" << endl;
   cout << "mas podem ser utlizadas dentro da classe" << endl;

   system("pause");

   return 0;
}

Classe #2 – Planetas

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

class Planetas {

private:
    // Variavel de intancias
     double x, y;
     double massa;

public:

     // Variavel de intancias
     string apelido;

     // Variavel da classe é compartilhada por todos
     static int numeroDePlanetas;

     // Construtor
     //  x e y são  variaveis instanciadas,
     //  mas newX and newY são variaveis locais
     //  O construtor incrementa o valor

  Planetas(double novoX, double novoY, double novaMassa)
  {
    x = novoX;
    y = novoY;

    massa = novaMassa;
    numeroDePlanetas++;
   }
};

  int Planetas::numeroDePlanetas;

Encapsulamento que em programação orientada a objetos significa separar o programa em partes, o mais isoladas possível. A idéia é tornar o software mais flexível, fácil de modificar e de criar novas implementações. Objetos restringem a visibilidade de seus recursos (atributos e métodos) aos outros usuários. Todo objeto tem uma interface, que determina como os outros objetos podem interagir com ele. A implementação do objeto é encapsulada, isso é, invisível ou visível  fora do próprio objeto.

PublicQuando precede uma lista de membros de classe, o  públic  palavra-chave especifica que esses membros são acessíveis a partir de qualquer função. Isso se aplica a todos os membros declarados até o próximo especificador de acesso ou o fim da classe. Ou seja visível a todos.

Private – Quando precede uma lista de membros de classe, o private palavra-chave especifica que esses membros são acessíveis somente dentro de funções de membro e amigos da classe.  Isso se aplica a todos os membros declarados até o próximo especificador de acesso ou o fim da classe. Ou seja visível somente para membros dentro da classe.

Protected – O protected palavra-chave especifica o acesso a membros de classe no lista de membros até o próximo especificador de acesso (pública ou private) ou no final da definição de classe.  O Protected é mistura entre Public e Private ou seja é visível somente para membros da classe e visível para subclasses.

Publico VS Private

  • Publico todas as classes podem usar os métodos e campos.
  • Privado apenas a classe  podem usar os métodos e campos.

Por que Controlar o Acesso?

  • Proteger informação privada.
  • Esclarecer como outros programadores devem usar sua classe.
  • Manter a implementação separado da interface.

Exemplo:

imagine o seguinte cenário,  temos uma classe que é responsável por transações de cartões de credito geralmente este tipo de classe pertence a companhia de cartões de credito e foi desenvolvida por um outro programador e esta dentro de uma DLL ou OS, acontece que o desenvolvedor terceirizado cometeu um deslize deixando visível a propriedade numero do cartão. Um desenvolvedor malicioso pode facilmente capturar o numero do cartão referenciando o objeto.

Neste exemplo você deve brincar com o código fonte a fim de resolver o problema de controle de acesso , use CTRL+espaço após a classe para ver a visibilidade de acesso dos métodos e campos.

C++

Classe #1 – Principal

#include "stdafx.h"
#include <iostream>
#include <string>
#include "cartaocredito.h"

using namespace std;

void metodoMalicioso(CartaoCredito& cartao)
 {
    cartao.gastos = 0;
    cout << "Seu numero de cartão: " << cartao.numeroCartao;
 }

int _tmain(int argc, _TCHAR* argv[])
 {
   // Uma transação hipotetica
   CartaoCredito transacao;
   transacao.cobranca("3453 3636 0001 1267", 350.00);

   // Metodo malicioso Injeta um gasto valor de 0 e imprime o numero do cartão
   metodoMalicioso(transacao);

   cout << endl;

   system("pause");

   return 0;
 }

Classe #2 – Cartão de Credito

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

class CartaoCredito
 {
  // Esta declaração esta errada
  // Deste modo é possive capturar o numero do cartão
  // A classe expos o numero para que seja acessivel de outra classe
  // para não expor os numero use private

// private:
 public:

string numeroCartao;
   double gastos;

//public:
  void cobranca(string nCartao, double valor)
  {
    numeroCartao = nCartao;
    gastos = gastos + valor;
  }

  CartaoCredito()
  {
  }
};

Classes – Static e Construtores – C++

Publicado: 10 de fevereiro de 2014 em C/C++

Construtores

Construtores são métodos especiais chamados pelo sistema no momento da criação de um objeto. Eles não possuem valor de retorno, porque você não pode chamar um construtor para um objeto, você só usa o construtor no momento da inicialização do objeto. Construtores representam uma oportunidade de inicializar seus dados de forma organizada. Construtores são obrigatórios em uma classe, mas não é preciso declara-los, caso não declare um construtor por default a declaração é: Classe().

Static

Enquanto a maioria das variáveis ​​declaradas dentro de uma classe ocorre em uma base de instância a instância (o que quer dizer que, para cada instância de uma classe, a variável pode ter um valor diferente), uma variável de membro estático tem o mesmo valor em qualquer instância a classe e nem sequer exige uma instância da classe para existir.

Lembrando que C++ não é preciso declarar uma nova instancia da classe como em Java, um vez a classe declarada basta chama-la sem usar o clássico comando java new:


// Instanciando uma classe JAVA

Bebe Marcia = new Bebe();

// Instanciando uma classe C++

Bebe Marcia;

Exemplo:

Neste cenário queremos saber quantos objetos de uma determinada classe foram instanciados, para isto criamos um contador no construtor do objeto e a cada objeto criado o contador aumenta nos mostrando no final a quantidade exata de novos objetos de uma classe. Visto que nosso contador pertence a classe e não a cada instancia de cada classe, neste caso para usar o contador não precisamos instanciar a classe graças a declaração static.

C++

Classe #1  – Principal

#include "stdafx.h"
#include <iostream>
#include <string>
#include "bebe.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
 {
  Bebe bebe1;
  Bebe bebe2;
  Bebe bebe3;

  cout << "Bebe 1 Construtor: " << bebe1.numeroBebeStatico << " Publico estatico: " << bebe1.numeroPublico() << endl;
  cout << "Bebe 2 Construtor: " << bebe2.numeroBebeStatico << " Publico estatico: " << bebe2.numeroPublico() << endl;
  cout << "Bebe 3 Construtor: " << bebe3.numeroBebeStatico << " Publico estatico: " << bebe3.numeroPublico() << endl;

  system("pause");
  return 0;
 }

Classe # 2 – Construtor

#include "stdafx.h"
#include <iostream>
#include <string>

 using namespace std;

class Bebe {
 private:
  int id;
  static int numeroBebePublico;

public:

static int numeroBebeStatico;

int numeroPublico()
  {
   numeroBebePublico++;
   return numeroBebePublico;
  }

// Construtor da classe
   Bebe()
  {
   id = Bebe::numeroBebeStatico++;
  }
};
 int Bebe::numeroBebeStatico = 0;
 int Bebe::numeroBebePublico = 0;

Classes – Referência – C++

Publicado: 8 de fevereiro de 2014 em C/C++

Tipos Primitivos

Um tipo primitivo (também conhecido por nativo ou básico) é fornecido por uma linguagem de programação como um bloco de construção básico. Dependendo da implementação da linguagem, os tipos primitivos podem ou não possuir correspondência direta com objetos na memória.

Ex: int, long, double, boolean, char, short, byte, float.

Referência

Referência na ciência da computação é registro que aponta o local em que se encontram armazenados os dados que identificam outro dado.

Tipos são arrays e objetos, – String, int[], Classes, …

Variáveis são como canecas fixas e os primitivos são pequenos o suficiente para caber dentro da caneca. Os objetos são grandes para caber dentro de variáveis. Variáveis guardam números que localizam um objeto e a localização do objeto é chamada de referencia.

Importante: Em C++ o objeto é instanciado a partir de sua criação e é usado o símbolo & ( e comercial)  para referenciar objetos.

Bebe Patricia;

Exemplo:

Neste cenário temos um bebê recém nascido que precisa ser registrado no cartório, para isto vamos criar um objeto bebê e através de um método vamos cadastrar os dados do bebê referenciando o objeto ao nosso bebê.

C++

1 – Classe Referencia – Arquivo referencia.cpp

#include "stdafx.h"
#include <iostream>
#include <string>

// Inclui Classe Bebê
#include "bebe.h"
using namespace std;

// O objeto Bebe& é responsável pela referencia
// Bebe sem o & não é referenciado, deixando o objeto vazio.
void cartorio(int codigo, string cadastro[] , Bebe& objeto)
  {
      objeto.codigo    = codigo;
      objeto.nome      = cadastro[0];
      objeto.sobreNome = cadastro[1];
      objeto.nomeMae   = cadastro[2];
      objeto.nomePai   = cadastro[3];
      objeto.sexo      = cadastro[4];
  }
int _tmain(int argc, _TCHAR* argv[])
  {
 // Vamos instanciar um novo bebe
 Bebe Samanta;

// Vamos solicitar a ficha de registro para o novo bebê
int codigoCartorio = 1438275;
string fichaRegistro[] = { "Samanta", "Amaral", "Roberto Amaral", "Marcia Amaral", "Feminino" };

// Vamos preerncher a ficha do novo bebê
 cartorio(codigoCartorio, fichaRegistro, Samanta);

 // Imprime registro do bebê
 cout << "Registro de Nascimento:\n"; cout << "\n";
 cout << "Código: " << Samanta.codigo << "\n";
 cout << "Nome: " << Samanta.nome << " " << Samanta.sobreNome << "\n";
 cout << "Nome do Pai: " << Samanta.nomePai << "\n" ;
 cout << "Nome da Mãe: " + Samanta.nomeMae << "\n"; cout << "\n";
 cout << "Registro efetuado com sucesso\n";
 system("pause");
      return 0;
  }

C++ 2- Classe Bebe – Arquivo Bebe.h

#include "stdafx.h"
#include <iostream>
#include <string>
 using namespace std;
class Bebe
  {
   public:  Bebe()
  {
      codigo;
      nome;
      sobreNome;
      nomePai;
      nomeMae;
      sexo;
  }
public:
   int codigo;
   string nome;
   string sobreNome;
   string nomePai;
   string nomeMae;
   string sexo;

  };
 

Classes – C++

Publicado: 7 de fevereiro de 2014 em C/C++

Programação Orientada a objeto

Programação orientada a objetos representa o mundo real. Na programação orientada a objetos, implementa-se um conjunto de classes que definem os objetos presentes no sistema de software.

Classes

Em orientação a objetos, uma classe é uma estrutura que abstrai um conjunto de objetos com características similares. Uma classe define o comportamento de seus objetos através de métodos e os estados possíveis destes objetos através de atributos. Classes, que podem conter dados e funções, apresentar tipos definidos pelo usuário em um programa. Tipos definidos pelo usuário em linguagens de programação tradicionais são coleções de dados que, em conjunto, descrevem atributos de um objeto e estado. Tipos de classe em C + + permitem que você para descrever os atributos e estado, e para definir o comportamento.

Polimorfismo

Na programação orientada a objetos, o polimorfismo permite que referências de tipos de classes mais abstratas representem o comportamento das classes concretas que referenciam. Assim, é possível tratar vários tipos de maneira homogênea (através da interface do tipo mais abstrato). O termo polimorfismo é originário do grego e significa “muitas formas” (poli = muitas, morphos = formas).

O polimorfismo é caracterizado quando duas ou mais classes distintas tem métodos de mesmo nome, de forma que uma função possa utilizar um objeto de qualquer uma das classes polimórficas, sem necessidade de tratar de forma diferenciada conforme a classe do objeto.

Instanciando Objetos

Instanciação de objetos é o processo de criar a estrutura lógica dos mesmos na memória. Isto ocorre quando declaramos os objetos, pois neste momento todo o processo de construção dos mesmos é efetivado. Assim, toda vez que declaramos um objeto estamos instanciando-o, ou seja, estamos criando uma instância da classe.

Exemplo:

Neste cenário temos  duas classes,  a classe cachorro e a classe espécie, na classe cachorro temos o que todos os cachorros tem em comum e na classe  espécie temos toda a herança da classe cachorro e mais algumas descrições da espécie. Usamos polimorfismo para escrever uma função virtual no qual as duas classes tem em comum:


// Exemplo da palavrea chave class
// Exibe polimorfismo/virtual functions.

#include "stdafx.h"
#include <iostream>
#include <string>
#define TRUE = 1

using namespace std;

// Classe Cachorro
class cachorro
{
public:  cachorro()
{
   _pernas = 4;
   _latido = true;
  }

int getPernas()
  {
   return _pernas;
  }

void setTamanhoCachorro(string tamanhoCachorro)
{
   _tamanhoCachorro = tamanhoCachorro;
}

// Função virtual
virtual void setOrelhas(string tipo)
{
   _tipoOrelhas = tipo;
  }

private:
  string _tamanhoCachorro, _tipoOrelhas;  int _pernas;  bool _latido;

};

// Classe especie
class especie : public cachorro
{
public:

especie(string cor, string tamanho)

{   _cor = cor;
_tamanho = tamanho;
setTamanhoCachorro(tamanho);
  }

string getCor()
  {
   return _cor;
  }

string getTamanhoCachorro()
  {
   return _tamanho;
  }

string getOrelhasComprimento()
  {
   return _orelhaComprimento;

}

string getOrelhaTipo()
  {
   return _orelhaTipo;
  }

// Função virtual redefinida (polimorfismo)
void setOrelhas(string comprimento, string tipo)
  {
   _orelhaComprimento = comprimento;
   _orelhaTipo = tipo;  }

protected:
  string _cor, _orelhaComprimento, _orelhaTipo, _tamanho;
};

// Executa o programa
int main()
 {
  cachorro mongrel;
  especie labrador("amarelo", "grande");

  // Polimorfismo da Classes
  mongrel.setOrelhas("pontuda");
  labrador.setOrelhas("longa", "caidas");

cout << "Bob um mongrel de " << mongrel.getPernas() << " patas " << endl;

cout << "Cody um labrador "  << labrador.getTamanhoCachorro() << " e "
     << labrador.getCor() << " com orelha "
     << labrador.getOrelhasComprimento() << " e "   << labrador.getOrelhaTipo() << endl;

system("pause"); }