Modelo de objeto C++Modelo de objeto C++
Diretório de artigos
Dados e funções da linguagem C
Na linguagem C, dados e funções são declarados separadamente.
- dados
typedef struct point2d
{
float x;
float y;
} Point2d;
- função
Imprima o valor de Point2d
void Point2d_print(const Point2d * pd)
{
printf("(%f, %f)", pd->x, pd->y);
}
Classe C++
Perceba também a função da linguagem C, a seguinte definição pode ser feita em C++
class Point2d
{
Point2d(float x, float y):m_x(x), m_y(y){}
print()
{
printf("(%f, %f)", m_x, m_y);
}
private:
float m_x;
float m_y;
};
Pergunta: Point2d de C para C++, que mudanças ocorreram no layout da memória?
A resposta é nenhuma mudança.
Neste exemplo, os membros de dados em C++ são iguais aos de C. A diferença é que há uma função de membro não estática adicional impressa em C++, mas a função de membro não estática e os membros de dados são separados e não ocupam o tamanho da turma. Ou seja, a chamada da função print é na verdade print(Point2d* pd), assim como a chamada de Point2d_print na linguagem C.
A carga adicional do layout de memória C++ é causada pelo virtual, que inclui principalmente funções virtuais e classes base virtuais.
Modelo de objeto C++
Em C++,
existem dois tipos de membros de dados de classe: estáticos (estáticos) e não estáticos (não estáticos).
Existem três tipos de funções de membro de classe: funções estáticas (estáticas), funções não estáticas (não estáticas) e funções virtuais (virtuais). )
Modelo de objeto C++:
- Membros de dados não estáticos estão dentro da classe
- estático fora da classe
- Funções estáticas (estáticas) e funções não estáticas (não estáticas) fora da classe
- Função virtual (virtual):
a. Cada classe gera vários ponteiros para funções virtuais e os coloca na tabela virtual (tabela virtual, vtbl)
b. Adiciona um ponteiro à tabela virtual (vptr) para cada objeto de classe.
c. O type_info (usado para suportar RTTI) de cada classe também é especificado pela tabela virtual, que geralmente está localizada no primeiro slot.
class Point2d
{
Point2d(float x, float y):m_x(x), m_y(y),m_pointCount(2){}
virtual ~Point2d(){}
static int getPointCount(){return m_pointCount;}
print()
{
printf("(%f, %f)", m_x, m_y);
}
private:
float m_x;
float m_y;
static int m_pointCount;
};
O modelo de objeto C++ do código acima é o seguinte
+---------------+
| float m_x; | virtual table
+---------------+
| float m_y; | +---------------+
+---------------+ | | +--------------------+
| vptr Point2d +----------> +------> type_info(RTTI |
+---------------+ +---------------+ +--------------------+
| | +--------------------+
Point2d pt2; | +------> Point2d::~Point2d()|
+---------------+ +--------------------+
+-------------------------------------+ +------------------------------------+
| static int Point2d::m_pointCount | | Point2d::Point2d(float x, float y) |
+-------------------------------------+ +------------------------------------+
+-------------------------------------+ +------------------------------------+
| static int Point2d::getPointCount() | | Point2d::print() |
+-------------------------------------+ +------------------------------------+
Referência:
- Explore o modelo de objeto C++ em profundidade