C++面对对象基础
1 C++的模型初探
-
在语言中直接对对象程序设计的部分,主要设计了构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态。
-
对于各种支持的底层实现的机制
在C语言中,定义的数据和处理数据的函数是分离的,换句话说就是数据和处理数据的函数本身是没有关联的,语言本身是没有支持数据和函数联系的特性。在C++中,通过抽象数据类型(abstract data ADT),在类中定义了数据和函数,来实现数据和函数的直接的绑定,所以C++是一个面对对象思想的语言,C语言是一种面对过程的语言,但是我个人理解,面对对象和面对过程是一种思维方式,C同时可以做到面向对象,只是比较C++而言更不直观和方便。
-
整体说来在C++中类存在两种成员数据:
static
、nonstatic
; 三种成员函数:static
、nostatic
、virtual
。
2 面向对象的基础知识
C++中class从面对对象出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实中的类。但是对于计算机,程序并没有没有什么不同。
/***************************************************************************************
@ Copyright :
@ Author : Krone
@ Data : Do not edit
@ LastEditor :
@ LastData :
@ Describe :
*****************************************************************************************/
#include "iostream"
using namespace std;
class C1
{
public:
int i; //4
int j; //4
int k; //4
protected:
private:
}; //12
class C2
{
public:
int i; //4
int j; //4
int k; //4
static int m;
public:
int getK() const
{
return k;
}
void setK(int val)
{
k = val;
}
protected:
private:
};
struct S1
{
int i;
int j;
int k;
};
struct S2
{
int i;
int j;
int k;
static int m;
}; //
int main()
{
printf("c1:%d \n", sizeof(C1));
printf("c2:%d \n", sizeof(C2));
printf("s1:%d \n", sizeof(S1));
printf("s2:%d \n", sizeof(S2));
system("pause");
}
通过上面的例子,我们可以得到:
-
C++类对象中成员变量和成员函数是分开存储
-
成员变量:
- 普通成员变量:储存于对象中,与struct变量有相同的内存布局和对齐方式
- 静态成员变量:储存于全局变量
成员函数:储存于代码代码段中。
那么就存在一个问题,C++编译器是如何将面向对象理论计算机的转变,或者说C++编译器是如何管理具体的对象和方法的?
class Test
{
private:
int m1;
public:
Test(int i)
{
m1 = i;
}
int getm1()
{
return m1;
}
static void print()
{
printf("this is class Test\n");
}
};
Test a(10);
a.getm1();
Test::print();
struct TestC
{
int m1;
};
int Test_getm1(Test **p_this*)
{
return *p_this*->m1;
}
void Test_init(Test **p_this*)
{
*p_this*->m1;
}
void Test_printf()
{
printf("this is class Test\n");
}
Test a;
Test_init(&a,10);
Test_getm1(&a);
Test_printf();
对比这两个代码,我们可以得到几个结论:
- C++类中的成员变量和成员函数的分开存储的,也就是说我们之前学习的内存四区的模型依然是有效的。
- C++中的每一个普通的函数都隐式的包含了一个指向当前对象的this指针
- 静态成员变量,成员变量属于类,但是静态成员变量和普通成员变量依然在this指针上存在差异,静态成员变量不包含指向具体对象的指针,而普通的成员变量存在指向具有对象的指针。
3 const修饰成员函数
- const类对象只能调用const成员函数,不能调用普通成员函数;
- const成员函数不能修改类的成员变量,若要修改则用mutable修饰该成员变量。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」