C++中的类和对象

在C++中,类和对象是很重要的概念,因为这个不仅涉及到面向对象编程的核心思想,更是构建模块化,可复用代码的基础

简单介绍一下类

1.1、类的定义格式

class为定义类的关键字,Stack为类的名字,{}是类的主体,类体中的内容成为类的成员,类中变量成为类的属性或成员变量,类中的函数称为成员函数

cpp 复制代码
#include<iostream>
using namespace std;
class Stack{
public:
		void Init(int n=4
		{
			array=(int *)malloc(sizeof(int)*n);
			if(nullptr==array)
			{
				perror("malloc申请内存失败");
				return;
			}
		}
		capacity=n;
		top=0;
}

为了方便区分,我们通常会在成员变量前加上特殊表示

C++中struct也可以定义类,并兼容C的struct用法,定义在类面的成员函数默认为inline。

1.2、访问限定符

C++一种实现封装的方式,用类将对象的属性和方法结合在一起,让对象更完善,选择性的将接口提供给外部用户使用

public修饰的成员可以直接访问,但是protected和private修饰的成员在类外不能直接访问

访问权限作用域从该访问限定符出现的为止到下一个访问的位置出现时位置。作用域到}就算结束

class定义成员没有被访问限定符修饰时默认为private,struct默认为Public.

1.3、类域

类定义了一个新的作用域,类的所有成员都在类的作用域里,类外定义成员时,需要用::作用域操作符来说明操作符指明成员属于哪个域

cpp 复制代码
#include<iostream> 
using namespace std;
class Stack{
	public:
		void Init(int n=4);
		private:
			void Init(int n=4);
			size_t=capacity;
			size_t top;
			
};
void Stack::Init(int n)
{
	array=(int*)malloc(sizeof(int)*n);
	if(nullptr==array)
	{
		perror("malloc申请空间失败");
		return;
	}
	capacity=n;
	top=0;
}

实例化

用类类型在物理空间中创造对象的过程,成为类实例化处对象,类是对象的一种抽象描述,限定了类哪些成员变量,这些成员变量只是声明,没有分配空间。用类实例化出对象时,才会分配空间

一个类可以实例化很多对象,实例化出的对象占用实际的物理空间,存储类成员变量

就好比是类是设计图,设计图规划了房间数量,房间功能大小,但是实体建筑不存在,也不能住人,用设计图修建出房子,类就像设计图,不能存储数据,实例化出的对象可以

cpp 复制代码
#include<iostream>
using namespace std;
class Date{
	public:
		void Init(int year,int month,int day)
		{
			_year=year;
			_month=month;
			_day=day;
		}
		void Print()
		{
			cout<<_year<<"/"<<_month<<"/"<<_day<<endl;
		}
		private:
			int _year;
			int _month;
			int _day;
};
int main()
{
	Date d1;
	Date d2;
	d1.Init(2024,2,11);
	d1.Print() ;
	d2.Init(2020,2,11);
	d2.Print();
	return 0;
}

内存对齐规则

第一个成员与结构体偏移量为0的地址处

其他成员变量要对齐到某个数字的整数倍地址处

对其数=编译器默认的一个对其数与该成员大小的较小值

VS中默认的对其数为8

结构体总大小为最大对其数的整数倍。

cpp 复制代码
#include<iostream>
using namespace std;
class A{
	puiblic:
		void Print()
		{
			cout<<_ch<<endl;
		}
		private:
			char _ch;
			int _i;
};
class B
{
	public:
		void Print()
		{
			//..
		}
};
class C{
	///
};
int main()
{
	A a;
	B b;
	C c;
	cout<<sizeof(a)<<endl;
	cout<<sizeof(b)<<endl;
	cout<<sizeof(c)<<endl;
	return 0;
}

this指针

Date类有两个成员函数,当d1调用init和print函数时,this指针会解决访问对象的问题

类的成员函数默认在形参的第一个位置,增加一个当前类类型的指针,叫this

C++规定不能在实参和形参的位置现师的写this指针,但是可以在函数体内显示使用this指针

cpp 复制代码
#include<iostream>
using namespace std;
class Date{
	public:
		void Init(int year,int month,int day)
		{
			_year=year;
			this->_month=month;
			this->_day=day;
		}
		void Print)
		{
			cout<<_year<<"/"<<_month<<"/"<<_day<<endl;
		}
		private:
			int _year;
			int _month;
			int _day;
};
int main()
{
	Date d1;
	Date d2;
	d1.Init(2024,7,21);
	d1.Print();
	d2.Init(2020,2,11);
	d1.Print();
	return 0;
}

面向对象三大特性:封装 继承 多态
C++中数据和函数都在类里面,通过访问限定符进行了限制,不能再随意通过对象直接修改数据,这是C++封装的一种体现,这个是最重要的变化
C++中也有一些相对方便的语法,Init给的缺省参数会方便很多,成员函数每次不需要传对象地址,this就隐晦的传递了,很方便

相关推荐
2501_9475758010 小时前
计算机毕业设计之jsp开山车行二手车交易系统
java·开发语言·hadoop·python·信息可视化·django·课程设计
骑士雄师10 小时前
java面试题 4:鉴权
java·开发语言
时间的拾荒人11 小时前
C语言字符函数与字符串函数完全指南
c语言·开发语言
浆果020711 小时前
NanoTrack C++ — RK3588 实时目标跟踪
c++·目标跟踪·rk3588
ysa05103012 小时前
【并查集】判环
c++·笔记·算法
2501_9481069112 小时前
计算机毕业设计之基于jsp教科研信息共享系统
java·开发语言·信息可视化·spark·课程设计
持力行12 小时前
C/C++ 中的 char*:它标识数组吗?为什么能用下标访问?
c语言·c++
取经蜗牛12 小时前
Python 第一阶段完全指南:从零到第一个实用工具
开发语言·python
dog25013 小时前
从重尾到截断流量模型的演进
开发语言·php
qq_4017004113 小时前
Qt QSS 完全入门写出漂亮界面以及解决样式不生效问题
开发语言·qt