Autor: Henrique | Publicado: 2009-06-10T14:37:00-07:00

Sobrecargade OperadoresRafaelde Andrade CastroHenriqueAugusto Diniz RibeiroO que é umoperador?Um operador éa parte de um código fonte que modifica um conteúdo deuma variável, ou declara o seu valor inicial. Ex.Multiplicação (*), Divisão(/), Adição(+),Atribuição(=). Os operadores são nativos dalinguagem, ou seja, cada linguagem possui seus operadores definidos.Os operadores possuem o conceito de serem unário ou binário,ou seja, podem utilizar dois operandos ou apenas um.Os operadores em umalinguagem de programação são apenas símbolosque por trás existem funções que determinam oque aquele símbolo faz com o valor, as funçõesde operadores são pré-definidas apenas para os tiposprimitivos de variáveis, no qual essas funçõesnão têm como serem alteradas, pelo fato de que elas jásão nativas da linguagem, isso faz com que mesmo utilizando asobrecarga destes operadores não tem como fugir de suafuncionalidade natural.A sobrecarga deoperadores é feito a partir de objetos de uma classe, que sãodados abstratos, sendo assim para sobrecarregar operadores éobrigatório que a linguagem tenha recursos de orientaçãoa objeto.Observações: Não se pode criar novosoperadores, apenas sobrecarregar operadores já existentes.Não se pode alterar apropriedade do operador, ou seja, se ele é binário suasobrecarga deverá permanecer binária, se ele forunário sua sobrecarga deverá permanecer unária.Operadores que podem ser sobrecarregados:Operadores que nãopodem ser sobrecarregados:Exemplode sobrecarga de operadores unários:classponto{private:intx,y;public:ponto(intx1=0, int y1=0){x=x1;y=y1;}//constructorPontooperator++() //função operadores pré fixada{x++;y++;returnponto(x,y)}voidprintpt()const //imprime ponto{cout&lt;&lt;”(”&lt;&lt;x&lt;&lt;”,”&lt;&lt;y&lt;&lt;”)”;}};voidmain(){pontop1,p2(2,3),p3; //declara e inicializacout&lt;&lt;”\np1= ”; p1.printpt();//imprime}Observe.:p1++; é equivalente a p1.operator++();Exemplode sobrecarga de operadores binários:classvenda{vendaoperador+(venda v) const; //função operadora}vendavenda :: operator + (venda v) const //soma dois objetos{intpec = npecas + v.pecas;floatpre = preco + v.pecas;returnvenda(pec,pre);}voidmain(){VendaA(58,12734.53), B(30,6000.30),T;T=A+B;}Somandoobjetos da classe ponto: funções operadorasClassponto{pontooperador + (ponto p) const //soma dois objetos{returnponto(x+p.x,y+p.y);}pontooperador + (int n) const //soma um número a um objeto{returnponto(x+n,y+n);}&shy;}voidmain(){p3=p1+p2;p4=p1+5;}Observe.:p4=p1+5;Éequivalente a p4=p1.operator+(5); por isso não podemosescrever instruções p4=5+p1; que seriam interpretadascomo: p4=5.operator+(p1)//erradoExpressõesLógicasQuandouma expressão lógica é calculada dentro doprograma, é feita a seguinte associação numéricacom o valor da expressão:verdadeiro– 1falso– 0Maisgenericamente o valor zero está associado ao valor lógicofalso, enquanto que qualquer valor diferente de zero estáassociado ao valor lógico verdadeiro.Assim,uma comparação como por exemplo a &gt; b, quandocalculada, tem associado a si o valor 1 se a &gt; b (verdadeira) e 0se a &lt;= b (falsa).Damesma forma uma expressão aritmética como por exemplo a+ b, pode ser considerada falsa ou verdadeira, conforme seu valorseja zero ou diferente de zero.Oprograma abaixo mostra algumas variações e exemplos dautilização de expressões aritméticas comológicas e vice-versa. Verifique o que será impressoabaixo:#include&lt;stdio.h&gt;intmain(){chara;intb;intx = 0, y = 1;//os valores atribuidos a “a” e “b” sãozero e um, dependendo se a//expressão é verdadeira ou falsaa= x &lt; y;cout&lt;&lt;"\n(1) valor de a = "&lt;&lt;a;a= x &lt; y &amp;&amp; y &gt; 0;cout&lt;&lt;"\n(2) valor de a = "&lt;&lt;a;a= x &gt; y;cout&lt;&lt;"\n(3) valor de a = “&lt;&lt;a;b= x+y &lt; x*y  x == y;cout&lt;&lt;"\n(4) valor de a = "&lt;&lt;b;//comparaçõesif(1) cout&lt;&lt;\n (5) sempre verdadeiro";if(-5) cout&lt;&lt;\n (6) sempre verdadeiro";if(0) ;elsecout&lt;&lt;"\n (7) sempre falso";if(1 == 1) cout&lt;&lt;"\n (8) sempre verdadeiro";if(0 == 0) cout&lt;&lt;"\n (9) sempre verdadeiro";//a também pode receber valores aritméticos entre 0 e 255a= x * y;if(a) cout&lt;&lt;”\n (10) verdadeiro quando a diferente de zero- a = ”&lt;&lt;a;elsecout&lt;&lt;"\n (10) falso quando a igual a zero - a = ”&lt;&lt;a;//a e b como valores lógicosa= x * y;b= x + y;if(a &amp;&amp; b)cout&lt;&lt;"\n(11) verdadeiro se a e b não zero: a = “&lt;&lt;a&lt;&lt;”b= "&lt;&lt;b;elsecout&lt;&lt;"\n (11) falso se a ou b são zero: a =“&lt;&lt;a&lt;&lt;”b = “&lt;&lt;b;b= 0;while(1) // a repetição será infinita{if(b++ &gt; 4) break; // força a saídacout&lt;&lt;"\n(“&lt;&lt;11+b&lt;&lt;”) valor de b = “&lt;&lt;b;}//outro exemplo de whilea= 1;b= 0;while(a){cout&lt;&lt;"\n(“&lt;&lt;18+b&lt;&lt;”) valor de a = “&lt;&lt;a&lt;&lt;”valor de b = ”&lt;&lt;b;a= (b++) &lt; 3;}cout&lt;&lt;"\n(“&lt;&lt;18+b&lt;&lt;”) valor final de a = “&lt;&lt;a&lt;&lt;”e de b = “&lt;&lt;b;}(1)valor de a = 1(2)valor de a = 1(3)valor de a = 0(4)valor de a = 0(5)sempre verdadeiro(6)sempre verdadeiro(7)sempre falso(8)sempre verdadeiro(9)sempre verdadeiro(10)falso quando a igual a zero - a = 0(11)falso se a ou b são zero: a = 0 b = 1(12)valor de b = 1(13)valor de b = 2(14)valor de b = 3(15)valor de b = 4(16)valor de b = 5(18)valor de a = 1 valor de b = 0(19)valor de a = 1 valor de b = 1(20)valor de a = 1 valor de b = 2(21)valor de a = 1 valor de b = 3(22)valor final de a = 0 e de b = 4Assimsupondo int x,y; as seguinte expressões lógicas sãoequivalentes:(x&amp;&amp; y) (x != 0 &amp;&amp; y != 0) !(x == 0  y == 0)(x y) (x != 0  y!= 0) !(x == 0 &amp;&amp; y == 0)Lembram-sedaquele problema que dada uma sequência terminada por zero,calcular a soma dos elementos da sequência?intsoma, x;::x= 1; soma = 0;while(x){cin&gt;&gt;x;soma= soma + x;}cout&lt;&lt;“ovalor da soma = “&lt;&lt;soma;Otimizaçãodo Cálculo de Expressões LógicasQuandose usa uma expressão composta, com os operadores &amp;&amp; e (and e or), o compilador otimiza o cálculo das mesmas,muitas vezes não as calculando até o fim, quando o seuvalor já está determinado no meio do cálculo. Porexemplo, considere a expressão (a &gt; b &amp;&amp; c &gt; d).Se a &gt; b já é falso, não é necessárioverificar se c &gt; d, pois o resultado da expressão jáserá falso. O mesmo ocorre com (a &gt; b  c &gt; d). Se a &gt;b é verdadeiro, a expressão é verdadeiraindependente se c &gt; d ou não.Normalmenteos compiladores da linguagem c usam esta regra como padrão,sendo possível alterá-la através de uma opçãode compilação para que o cálculo seja completo.Emalguns casos, o resultado pode ser diferente, pois o cálculoda expressão completa tem efeitos colaterais. De uma maneirageral o uso de expressões que pressupõe a otimizaçãodeve ser feito com muito cuidado, para evitar tais efeitoscolaterais.Considerepor exemplo a seguinte solução para verificar se x éigual a algum elemento de um vetor a de n elementos.i= 0;while(i &lt; n &amp;&amp; a[i] != x) i++;Considerandoo caso em que x não é igual a nenhum dos elementos, seo cálculo da expressão for otimizada, o programa sai dowhile quando i = n e não realiza a comparaçãoa[i] != x, pois se realizasse estaria errado, pois o elemento a[n]está fora dos n elementos considerados.Invertendoagora a expressão acima:i= 0;while(a[i] != x &amp;&amp; i &lt; n) i++;Emboraa operação &amp;&amp; seja comutativa, a soluçãoestá errada, pois quando i = n a comparação a[n]!= x será efetuada, pois vem antes que a comparaçãoi &lt; n.Referenciashttp://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Sobrecarga_de_operadoresDeitel,HarveyM. C++ Como Programar. Tradução Carlos ArthurLang Lisbôa e Maria Lúcia Blank Lisboa. Porto Alegre.Reimpressão Bookman,2001