const char* foo() const;
Nesse método temos o const no início e no fim. O do fim sei que não deixa o método mudar os atributos do objeto que entrou no método. Mas e esse primeiro? Em que casos devo mais usar?
Agradeço pacas a ajuda no entendimento disso (que pode parecer simples à muitos). No mais, ótima semana! Att. Lucas Pereira Caixeta
--
Antes de enviar um e-mail para o grupo leia:
http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] Colabore com a Pesquisa de Preferência de Conteúdo
para Eventos do Grupo C & C++ Brasil:
http://www.surveymonkey.com/s/GBBGTXN
------~----~-------~---~---~---~---~----------------~------------~---------~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira: vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en
--
Antes de enviar um e-mail para o grupo leia:
http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] Colabore com a Pesquisa de Preferência de Conteúdo
para Eventos do Grupo C & C++ Brasil:
http://www.surveymonkey.com/s/GBBGTXN
------~----~-------~---~---~---~---~----------------~------------~---------~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira: vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en
O const pode servir para ambos.
}
struct X
{
//retorna um ponteiro const para um char const
const char* const f() const
{
return "x";
}
};
{
X x;
//declara um ponteiro const para um char const
const char * const c = x.f();
}
>> Opa, não havia reparado que era isso que esperava dizer. Só falei mesmo por
>> que aprendi recentemente e achei quer era algo pouco observado o fato de
>> const não servir para o ponteiro e sim para o objeto.
>
> O const pode servir para ambos.
Foi justamente o que ele havia dito.
Eu n�o gosto muito de usar const em vari�veis locais e par�metros quando
a atribui��o n�o � um valor literal. Sobre par�metros, pior ainda, pois
detalhes de implementa��o s�o transferidos para o prot�tipo da fun��o em
alguns compiladores:
http://asfernandes.blogspot.com/2009/08/buggy-const.html
Adriano
On 16/03/2010 09:09, Thiago Adams wrote:
Opa, não havia reparado que era isso que esperava dizer. Só falei mesmo por
que aprendi recentemente e achei quer era algo pouco observado o fato de
const não servir para o ponteiro e sim para o objeto.
O const pode servir para ambos.}struct X{//retorna um ponteiro const para um char constconst char* const f() const
Mas esse segundo const não faz sentido neste caso (tipo de retorno), pois não é uma variável.
Eu não gosto muito de usar const em variáveis locais e parâmetros quando a atribuição não é um valor literal. Sobre parâmetros, pior ainda, pois detalhes de implementação são transferidos para o protótipo da função em alguns compiladores: http://asfernandes.blogspot.com/2009/08/buggy-const.html
> Opa, não havia reparado que era isso que esperava dizer. Só falei mesmo por
> que aprendi recentemente e achei quer era algo pouco observado o fato de
> const não servir para o ponteiro e sim para o objeto.
Um uso mais claro da sintaxe seria:
char const * foo () const
onde a leitura de
char const *
deve ser feita da direita pra esquerda: tipo ponteiro para tipo
constante de char.
Quando o const ocorre no início:
const char *
entende-se que significa o mesmo que a construção acima.
É possível qualificar o próprio ponteiro como const; um ponteiro é um
objeto, afinal.
A seguinte construção:
char * const
significa: tipo constante de ponteiro para tipo char.
--
P.
S� outra observa��o sobre o const (atributo da fun��o). Se voc� tem na
sua classe um membro "int* p", o const n�o deixar� alterar p, mas *p
poder� ser alterado.
Para *p n�o ser alter�vel (e isso � independente do const final do
m�todo), dever� ser declarado como "const int* p".
Adriano
A construção:
const int * p
é equivalente a:
int const * p
onde p permanece mutável.
Se você deseja tornar p imutável, deve escrever:
int * const p
--
P.
> Se você deseja tornar p imutável, deve escrever:
>
> int * const p
>
Só faltou dizer que aí (caso p seja membro de uma classe) deverá ser
inicializado no construtor (após os dois pontos) e não poderá ser
atualizado, mesmo em métodos não-const.
Acho que agora já falamos tudo sobre const, não? :-)
Adriano
Faltou explicar const_cast e membros mutable. :-D
class Foo
{
private:
mutable int bar;
int BAR;
public:
const int* foo() const
{
bar++;
return &bar;
}
int FOO() const
{
return const_cast<Foo*>(this)->BAR++;
}
};
Isso me lembra uma histórinha:
A foo walked into a bar and said: "Hello World!!!"
> > A construção:
> >
> > const int * p
> >
> > é equivalente a:
> >
> > int const * p
> >
> > onde p permanece mutável.
> >
>
> Claro, exceto em métodos const.
O fato de o nome p ser ou não ser qualificado como const é
independente da existência ou não de métodos qualificados como const.
p é não-const, simplesmente.
Qualificar uma função com const no final:
bar::foo () const
é equivalente ao seguinte, onde this está explícito:
bar::foo ( bar const * this )
i.e. o qualificador const do método se aplica à variável this, apenas.
--
P.
sendo pedante em relação ao "equivalente":
bar::foo ( bar const * const this )
--
Thiago Silva
Computer Science
M.Sc. Candidate at Federal University of Pernambuco
jabber/gtalk: tsi...@jabber-br.org
http://blog.sourcecraft.info
Qual o problema de usar o const em variáveis locais?
Uso o const sempre que possível e variáveis locais são inicializadas
na declaração.
Como nesse caso acima, v�rias "vari�veis" locais s�o constantes em
potencial. Isso implica (sendo consistente) ficar usando const pra todo
lado.
Se estivermos falando de objetos (que poder�o ser passados como "const
Tipo&" ou que ter�o estado e m�todos const" a� � outra situa��o.
Adriano
const nao faz sentido para tipos primitivos, em lugar nenhum.
[]s
Humberto Pereira
Adriano
Ok, nao fazem sentido no escopo da discussao, passagem de parametros,
retorno de funcao e variaveis locais.
:)
[]s
Humberto Pereira
On 17/03/2010 11:36, Humberto Pereira wrote:
2010/3/17 Adriano dos Santos Fernandes<adri...@gmail.com>:
> detalhes de implementa o s o transferidos para o prot tipo da
fun o em
> alguns
compiladores:http://asfernandes.blogspot.com/2009/08/buggy-const.html
Qual o problema de usar o const em variáveis locais?
Uso o const sempre que possível e variáveis locais são inicializadas
na declaração.
Não é que há problema, é que na minha opinião isso dificilmente tem algum
benefício prático. Veja:
const int len = s.length();
const nao faz sentido para tipos primitivos, em lugar nenhum.
Claro que faz. Imagina vc sair alterando sem querer constantes usadas para flags (bit masks) porque trocou um == por =.
Adriano
--
Antes de enviar um e-mail para o grupo leia: http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] Colabore com a Pesquisa de Preferência de Conteúdo para Eventos do Grupo C & C++ Brasil:
http://www.surveymonkey.com/s/GBBGTXN
------~----~-------~---~---~---~---~----------------~------------~---------~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira: vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en
On Mar 17, 11:47 am, Murilo Adriano Vasconcelos <murilo...@gmail.com>
wrote:
> Não faz sentido o retorno de qualquer tipo que é retornado por valor ser
> const, já que modifcar a cópia não surtiria efeito no original.
A vantagem de se usar const neste contexto:
ex:
const int size = obj.getsize();
é :
* Garantir que a variável não é alterada no escopo dela promovendo
segurança
* Facilitar o entendimento e a revisão de código (conceito somente
leitura)
* Obriga a inicialização na declaração
--
Antes de enviar um e-mail para o grupo leia:
http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] Colabore com a Pesquisa de Preferência de Conteúdo
para Eventos do Grupo C & C++ Brasil:
http://www.surveymonkey.com/s/GBBGTXN
------~----~-------~---~---~---~---~----------------~------------~---------~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira: vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en