Qual é o significado dos sublinhados iniciais em um construtor C++?
-
22-09-2019 - |
Pergunta
OK, não sou um programador C++ muito experiente, mas queria saber qual é o significado dos sublinhados nos argumentos do seguinte construtor?
class floatCoords
{
public:
floatCoords(float _x, float _y, float _width, float _height)
: x(_x), y(_y), width(_width), height(_height)
{
}
float x, y, width, height;
...
Solução
É apenas uma convenção de nomeação, não significa nada para o idioma. Apenas certifique-se de não segui-lo com uma carta de caso superior: O que significa sublinhamento duplo (__const) em c?
Outras dicas
Nada especial.Ele apenas nomeou assim para distinguir entre as variáveis de membro e os nomes dos parâmetros.
Sublinhado é um caractere válido em identificadores C++.
Provavelmente, o autor do código estava tentando evitar o potencial conflito entre os nomes dos membros de dados e os nomes dos parâmetros do construtor na lista de inicializadores. Provavelmente, o autor não estava ciente do fato de que as regras de pesquisa do C ++ garantem que o conflito não ocorra de qualquer maneira. Ou seja, o seguinte código também produzirá resultados esperados
class floatCoords {
public:
floatCoords(float x, float y, float width, float height)
: x(x), y(y), width(width), height(height)
{
}
float x, y, width, height;
...
Embora possa ser confuso para um leitor despreparado.
Obviamente, dentro do corpo do construtor, os nomes de parâmetros ocultarão os nomes dos membros, tornando necessário usar this->...
ou nomes qualificados para acessar os membros dos dados. As chances são o autor do código estava tentando evitar isso também.
Estas são apenas convenções de nomenclatura de variáveis que diferentes pessoas/instituições assumem.Isso pode parecer desnecessário à primeira vista, mas na verdade é muito útil ao ler e escrever código, especialmente quando você tem parâmetros e variáveis-membro com o mesmo nome.Por exemplo.você normalmente pode ter estes três casos:
class A {
void foo(int age_) { //parameter
int age = 18; //local scope
if (age_ > age) cout << legal << endl;
}
int _age; //member
};
No exemplo acima:
- _variable - significa que esta é uma variável de membro da classe
- variável_ - significa que este é um parâmetro para uma função
- variável - significa que esta é apenas uma variável regular local para o escopo da função
Eles são apenas nomes para parâmetros passados.Acontece que eles correspondem a variáveis de membro e são usados para inicializadores.
Não há nenhum significado especial – é apenas uma convenção que algumas pessoas podem usar.
Eles não têm um significado sintático. No entanto, se você tem um monte de campos (por exemplo x
, y
, width
, e height
), é uma convenção comum nomear os parâmetros do construtor que os inicializam com o nome do campo, além de um sublinhado líder.
O objetivo desses sublinhados é distinguir a variável do parâmetro float _x
e a variável membro float x
.Sintaticamente, não há nenhum significado especial adicionado devido aos sublinhados.Eu pessoalmente prefiro prefixar todos os parâmetros com a_
e prefixe todas as variáveis de membro com m_
quando preciso codificar C++.
Portanto, quando entro em uma situação em que preciso misturar e combinar variáveis locais, de membro e de parâmetro, sei com quais estou lidando.
int y = a_x * 2;
m_x = y + 3;
Porque se você nomear den float x, flutuar y etc., você não poderá acessar os campos reais da classe porque eles têm o mesmo nome.
Não tem nada a ver com o idioma, é apenas uma convenção do programador real (para tornar o código mais óbvio, eu acho)