C++面对对象基础

1 C++的模型初探

  • 在语言中直接对对象程序设计的部分,主要设计了构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态。

  • 对于各种支持的底层实现的机制

    在C语言中,定义的数据和处理数据的函数是分离的,换句话说就是数据和处理数据的函数本身是没有关联的,语言本身是没有支持数据和函数联系的特性。在C++中,通过抽象数据类型(abstract data ADT),在类中定义了数据和函数,来实现数据和函数的直接的绑定,所以C++是一个面对对象思想的语言,C语言是一种面对过程的语言,但是我个人理解,面对对象和面对过程是一种思维方式,C同时可以做到面向对象,只是比较C++而言更不直观和方便。

  • 整体说来在C++中类存在两种成员数据:staticnonstatic; 三种成员函数: staticnostaticvirtual

image-20211111025933179

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");
}

image

通过上面的例子,我们可以得到:

  • 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修饰该成员变量。
posted @   Kroner  阅读(146)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示