Notas de estudo em C ++ (4): Análise essencial da cotação

0x01 significado da referência

  • As referências existem como aliases variáveis, para que possam substituir ponteiros em algumas situações
  • As referências são mais legíveis e práticas para ponteiros

Referência especial 0x02

1. Referência Const

Você pode declarar referências const em C ++, e seu uso é o seguinte:

const Type& nmae = var;

A referência const permite que a variável tenha um atributo somente leitura em vez do atributo const evolution no C ++.

Exemplo de código:

#include <stdio.h>

int main(int argc, char *argv[])
{
	int a = 4;
	const int& b = a;

	int* p = (int*)&b;

	*p = 5;

	printf("a = %d, b = %d\n",a, b);
	return 0;
}

Resultado da operação:

a = 5, b = 5
请按任意键继续. . .

Ao usar const para modificar a referência, o C ++ não recebe mais o valor da tabela de símbolos; nesse momento, a referência const se torna uma variável somente leitura.

2. Referência constante inicializada constante

Quando uma constante é usada para inicializar uma referência const, o compilador c ++ alocará espaço para o valor constante e usará o nome de referência como um alias para esse espaço. Portanto, em termos simples, o uso de uma constante para inicializar uma referência const gerará uma variável somente leitura.

Código de exemplo:

void Demo()
{
    printf("Demo:\n");
    
    const int& c = 1;
    int* p = (int*)&c;
    
    //c = 5;
    
    *p = 5;
    
    printf("c = %d\n", c);
}

int main(int argc, char *argv[])
{

    Demo();

    return 0;
}

Resultado da operação:

Demo:
c = 5
请按任意键继续. . .

0x03 Essência de referência

A implementação da referência dentro de c ++ é uma constante de ponteiro

Digite o nome ; <==> Digite * nome da const

O compilador c ++ usa a constante de ponteiro como implementação interna da referência durante a compilação, portanto, o tamanho do espaço ocupado pela referência é o mesmo que o ponteiro.

Da perspectiva do uso, uma referência é apenas um alias.

Código de exemplo:

#include <stdio.h>

struct TRef
{
    char* before;
    char& ref;
    char* after;
};

int main(int argc, char* argv[])
{
    char a = 'a';
    char& b = a;
    char c = 'c';

    TRef r = {&a, b, &c};

    printf("sizeof(r) = %d\n", sizeof(r));
    printf("sizeof(r.before) = %d\n", sizeof(r.before));
    printf("sizeof(r.after) = %d\n", sizeof(r.after));
    printf("&r.before = %p\n", &r.before);
    printf("&r.after = %p\n", &r.after);

    return 0;
}

Resultado da operação:

sizeof(r) = 12
sizeof(r.before) = 4
sizeof(r.after) = 4
&r.before = 00DAF938
&r.after = 00DAF940
请按任意键继续. . .

A função retorna o código de exemplo de referência:

#include <stdio.h>

int& demo()
{
    int d = 0;
    
    printf("demo: d = %d\n", d);
    
    return d;
}

int& func()
{
    static int s = 0;
    
    printf("func: s = %d\n", s);
    
    return s;
}

int main(int argc, char* argv[])
{
    int& rd = demo();
    int& rs = func();
    
    printf("\n");
    printf("main: rd = %d\n", rd);
    printf("main: rs = %d\n", rs);
    printf("\n");
    
    rd = 10;
    rs = 11;
    
    demo();
    func();
    
    printf("\n");
    printf("main: rd = %d\n", rd);
    printf("main: rs = %d\n", rs);
    printf("\n");
    
    return 0;
}

Resultado da operação:

demo: d = 0
func: s = 0

main: rd = -2
main: rs = 0

demo: d = 0
func: s = 11

main: rd = -2
main: rs = 11

请按任意键继续. . .

A variável representada por rd foi destruída quando a função retorna.No momento, rd é um ponteiro selvagem sem sentido. Então -2 é realmente um valor aleatório.

Acho que você gosta

Origin www.cnblogs.com/askta0/p/12732604.html
Recomendado
Clasificación