在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就隐晦的传递了,很方便