• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

ber0x88

std:: Dúvida...

16 mensagens neste tópico

Olá pessoal!!!  :P

Tava aqui a inventar em C++, e como não percebo grande coisa surgiu-me uma dúvida...

no código seguinte:

#include <iostream>

int main()
{
int numa;
int numo;
float total;
std::cout << "numero 1:" << std::endl;
std::cin >> numa;
std::cout << "numero 2:" << std::endl;
std::cin >> numo;
total = (numa + numo);
std::cout << "total:" << total << std::endl;
return 0;
}

tenho que usar sempre o "std::" senão ao construir dá sempre erros...

Tou a programar com o Anjuta 2.0.2 em ubuntu 6.10...

Descobri neste tópico: http://www.portugal-a-programar.pt/index.php?showtopic=8387

que pode-se evitar a repetição do "std::" incluindo a seguinte linha no inicio do código.

#include <iostream>

using std::cin; using std::cout; using std::endl; // linha inserida para evitar a repeticao do std::

int main()
{
int numa;
int numo;
float total;
cout << "numero 1:" << endl;
cin >> numa;
cout << "numero 2:" << endl;
cin >> numo;
total = (numa + numo);
cout << "total:" << total << endl;
return 0;
}

assim evitei a repetição do "std::" mas gostava de saber porquê o uso do "std::" quando pelo que sei em windows  não é necessário???

Cumps...  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

nunca programei C++ em windows, mas dúvido que isso não seja necessário.

Kyu, não será antes using namespace std;  ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tens de usar o namespace std como disseram....

using namespace std;

apartir dai já n tens de usar o operador de scope..."::"

e fazer std::cout.... etc etc...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um dos problemas do C é que só existe um espaço de nomes, isto significa que em projectos grandes em que tens de compilar código teu junto com muitas bibliotecas feitas por outros gajos pode acontecer (e acontece mesmo) que existam símbolos definidos em sítios diferentes mas com o mesmo nome.

Quando o C++ foi inventado, pos-se esse mecanismo de namespaces (espacos de nomes) exactamente para evitar a colisão de nomes que ocorre no C e que é um "problema" (para dizer pouco) de resolver. Assim o operador :: existe exactamente para referir um simbolo dentro de um espaco de nomes.

No entanto, como nada é perfeito, ter de meter <namespace>::simbolo sempre que se quer usar polui o código e portanto podes usar as keywords "using namespace xpto;" que basicamente diz ao compilador que sempre que ele encontrar um simbolo tb deve procurar a sua definicao no namespace xpto. No entanto o seu uso deve ser evitado visto que se meteres using namespace para 20 namespaces diferentes estás a contornar o mecanismo que evita colisões e imagina, podes ter colisoes!

Por último, dizes que "em windows  não é necessário" porque o compilador que estás a usar por defeito procura coisas no namespace std que é um namespace especial onde estão definidas todas as bibliotecas de origem da linguagem.

Espero que tenhas percebido.

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um dos problemas do C é que só existe um espaço de nomes, isto significa que em projectos grandes em que tens de compilar código teu junto com muitas bibliotecas feitas por outros gajos pode acontecer (e acontece mesmo) que existam símbolos definidos em sítios diferentes mas com o mesmo nome.

Quando o C++ foi inventado, pos-se esse mecanismo de namespaces (espacos de nomes) exactamente para evitar a colisão de nomes que ocorre no C e que é um "problema" (para dizer pouco) de resolver. Assim o operador :: existe exactamente para referir um simbolo dentro de um espaco de nomes.

No entanto, como nada é perfeito, ter de meter <namespace>::simbolo sempre que se quer usar polui o código e portanto podes usar as keywords "using namespace xpto;" que basicamente diz ao compilador que sempre que ele encontrar um simbolo tb deve procurar a sua definicao no namespace xpto. No entanto o seu uso deve ser evitado visto que se meteres using namespace para 20 namespaces diferentes estás a contornar o mecanismo que evita colisões e imagina, podes ter colisoes!

Por último, dizes que "em windows  não é necessário" porque o compilador que estás a usar por defeito procura coisas no namespace std que é um namespace especial onde estão definidas todas as bibliotecas de origem da linguagem.

Espero que tenhas percebido.

Cumprimentos

Obrigado tá muito esclarecedor...  :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Oi. Um a parte o meu prof não gosta do uso do namespace std porque diz que perdemos o controlo do programa. Por exemplo se usamos o cout definimos só using std::cout. bjs

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pelo que te li ainda ninguem te respondeu verdadeiramente à pergunta.

Eu não tenho muita prática em C++, mas aprendi a teoria ;) eheheheh

ok... o operador :: serve para aceder a métodos de classes não instancializadas.

Ou seja, podes aceder a um método de uma classe sem criar um objecto desse tipo. Aí é quanto usas:

classname::method()

se tiveres um objecto criado usas o ponto.

object.method()

se tiveres um ponteiro a pontar para um objecto desse tipo usas:

pointer_to_object->method()

O uso do prefixo serve para desambiguar colisões de nomes, podes no entanto mudar de namespace como já foi explicado acima.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok... o operador :: serve para aceder a métodos de classes não instancializadas.

Ou seja, podes aceder a um método de uma classe sem criar um objecto desse tipo. Aí é quanto usas:

classname::method()

os métodos não precisam de ser estáticos para os poderes aceder dessa forma?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok... o operador :: serve para aceder a métodos de classes não instancializadas.

Ou seja, podes aceder a um método de uma classe sem criar um objecto desse tipo. Aí é quanto usas:

classname::method()

os métodos não precisam de ser estáticos para os poderes aceder dessa forma?

Precisam. Pegando nas palavras do pedrotuga, a definição mais exacta seria:

O operador :: serve para aceder aos métodos estáticos de uma classe, sem que para isso tenha que ser instanciado um objecto dessa classe.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ehehe... eu bem disse que não tinha muita pratica :P

Rui carlos e dark, já que o assunto principal do tópico está resolvido há espaço agora para um off-topic não tao off-topic assim.

Voces programam diariamente em C? Mais o rui mas voces os dois, têm as respostas todas de C/C++ aqui no forum.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já viste...? E somos os dois do Benfica! :D

Diariamente, não. Ultimamente até tenho programado pouco em C/C++. Ultimamente tenho programado pouco, ponto. Mas amanhã isso deve mudar ;P

Mas quando tenho alguma coisa para fazer que envolva programação, se puder uso C++.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já viste...? E somos os dois do Benfica! :D

Lol, mais um. Quem não é do benfica não é bom programador de C/C++. Obviamente estou a brincar, nao tem nada a ver.

Epa... eu gosto de C++ mas porra... se tiver que escolher vou optar por coisas que me poupem trabalho: php ( yummie ) , matlab, python, etc etc

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pela ajuda pessoal!!! :thumbsup: esta linguagem tem muito que se lhe diga!!! :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora