嗨,小伙伴们!今天给大家浅浅的介绍一类和对象(什么是类?什么是对象?this是什么?)
一、类的基本概念:
1.浅谈类:
用C语言写结构体时,结构体内部只能定义变量;C++不仅可以定义变量,还可以定义函数。(C++中较为常见的是用 class 代替 struct)
2.初步认识类:
①类的基本构造:
②进一步解释:
类的主体内容称为类的成员,类的成员分为:类的属性(成员变量)、类的方法(成员函数)
③类的定义方式(2种):
(1)声明和定义都放在类中:
class classname
{
public:
void Showinfo()
{
cout<<_name<<”-”<<_sex<<”-”<<_age<<ebdl;
}
private:
char* _name;
char* _sex;
int _age;
};
(2)在类中声明,成员函数定义放在.cpp文件中(成员函数前需要加类名):
//声明
class classname
{
public:
void Showinfo();
private:
char* _name;
char* _sex;
int _age;
};
//定义
void classname::Showinfo()
{
cout<<_name<<”-”<<_sex<<”-”<<_age<<ebdl;
}
推荐大家使用第2种(本博客为了方便观察,演示时采用第1种)
④成员变量名命名规则:
大家一定注意到了上述代码中成员变量名,可是为什么成员变量要这样命名呢?
因为成员函数中一定有大量的参数是对成员变量进行操作的,因此,成员函数中的形参名称要尽可能的与成员变量的含义相似,又为了避免名称相同,所以在成员变量名称前面加上 _
3.类的访问限定符及封装:
①访问限定符:
用类将对象的属性与方法结合在一起,让对象更加完善,通过访问限定符选择性的将接口提供给用户使用。
说明:
(1)public修饰的成员在类外可以直接被访问
(2)protected和private修饰的成员在类外不可以直接被访问(可以理解二者相似)
(3)访问权限的作用域从访问限定符出现的位置开始直到下一个访问限定符出现为止
(4)若后面没有访问限定符,则到 } 为止
(5)class默认访问权限为private,struct默认访问权限是public
②封装 -- 面向对象三大特性:封装、继承、多态
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互(封装本质上是一种管理,让用户更方便使用类)
4.类的实例化:
用类类型创建对象的过程,就是类的实例化
类是对对象进行描述的,并没有分配实际的存储空间来存储类。类可以理解为是一种描述、一种设计理念,创建对象就可以理解为将这种描述、设计理念实现出来。(可以类比一下使用房屋设计图盖房子)
5.类对象模型:
要想知道类对象的大小就必须知道类对象是符合存储的。
①类对象是如何存储的:
我们知道一个类中有类的属性和方法这2个成员,那么存储空间是怎么定义的呢?
猜测:
(1)对象所使用的的存储空间中包含所有成员
这个我们基本上可以排除,因为我们使用相同的类创建不同的对象后,这些对象只是类成员变量有所差别,类成员函数都是一样的,如果按照这种存储方式存储,那么将会开辟许多不必要开辟的空间,从而造成浪费
(2)类成员函数只有一份,对象中保存类成员函数的地址(使用类成员函数表)
(3)只保存类成员变量,类成员函数存放在公共代码段
我们可以自行测试一下:
结论:一个类的大小,实际上就是类的成员变量的大小的总和,但是要注意内存对齐。(空类:编译器给了空类1个字节的空间来标识这个类的对象)
二、this指针:
1.this指针的概念:
先来看一段代码:
class Date
{
public:
void Init(int year,int month,int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date S1、S2;
S1.Init(2011,1,1);
S2.Init(2022,2,2);
return 0;
}
我们可以直观的看到,我们创建了一个类类型为Date名为S1和S2的变量,并调用Init函数对这2个变量进行初始化,但是问题来了:类成员函数中并没有关于S1这个对象的参数,那么编译器是怎么把这个函数的作用效果体现在对象S1上而不是S2上的呢?
其实C++编译器给每个“非静态的成员函数”增加了一个隐藏的指针参数,让该指针指向对象(调用函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,用户不需要传递。
2.this指针的特性:
①this指针的类型:类类型* const,成员函数不能给this赋值
②只能在成员函数内使用
③this本质上是成员函数的形参,当对象调用函数时,将对象的地址操作实参传递给成员函数中的 this形参,所以对象中不存在this指针
④this指针是成员函数第一个隐含的指针,编译器通过ecx寄存器自动传递,不需要用户传递