C++类和对象(上篇)

1. 类和对象

C语言面向过程的, 关注的是过程,分析并求出问题的步骤,通过函数调用逐步解决需求。
C++ 基于面向对象的,关注的是对象,将某件需求拆分成不同的对象,靠对象之间的交互完成需求。

1.1面向对象

对象: 简单来说就是将问题中的事务抽象.
面向对象:就是把事物都抽象为"对象".每个对象都是唯一的,且都具有它的属性与行为.
面向对象三大特征: 封装,继承,多态

1.2类

类是一个模板,它是对某一类实体(对象)来进行描述的,描述该对象具有那些属性,而那些方法,描述完成后就形成了一种新的自定义类型,才用该自动义类型就可以实例化具体的对象.
.drawio.drawio.png

2. 类的引入

C++兼容C结构体用法,且C++把结构体升级成了类。且不仅可以定义变量,也可以定义函数。

struct List {
    void init(List* q) {
        q->a = (int*)malloc(sizeof(int) * 4);
        q->cap = 4;
        q->size = 0;
    }
    int* a;
    int cap;
    int size;
};

但C++中更喜欢 使用class来定义类。

3. 类的定义

class className
{
	//类体:由成员函数和成员变量组成
};//一定要注意后面的分号
  • class:定义类的关键字
  • className:类名
  • {}:花括号所包括的作用域内为类体。
  • ;:定义结束后的分号不可省略

类体中内容称为类的成员:类中的变量称为类的属性成员变量; 类中的函数称为类的方法或者成员函数

类的两种定义方式:

类里面短小函数,适合做内联的函数,直接是在类里面定义的.

  1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
class Date
{
public:
	void showInfo()
	{
        cout << _year << "-" << _month << "-" << _day << endl;
    }
public:
	int _year;
	int _month;
	int _day;
}
  1. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名**::**
class callseName
{
    void Init();//函数声明
    int a; // 变量声明
    int cap;
    int size;
};

注意:类成员变量只有在实例化时才会开辟空间。 类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。

#include "classFile"

void clssFile::Init() // 这里指定Init是属于classFile这个类域的
{
    
}

4. 访问限定符

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选 择性的将其接口提供给外部的用户使用。

共有三个:

  1. private私有
  2. public共有
  3. protected保护

【访问限定符说明】

  1. public修饰的成员在类外可以直接被访问。
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)。
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. 如果后面没有访问限定符,作用域就到 } 即类结束。
  5. class的默认访问权限为private,struct为public(因为struct要兼容C)。

注意: 访问限定符只在编译时有用,当数据映射到内存后,没有任何限定符上的区别.
为什么成员变量在对象中,成员函数不在对象中呢?

每个对象成员变量是不一样的,需要独立存储,但是每个对象调用成员函数是一样的,放到公共区域(代码段)

5. 类的实例化

用类类型创建对象的过程,称为类的实例化

  1. 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;比如:入学时填写的学生信息表,表格就可以看成是一个类,来描述具体学生信息。
  2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量.
  3. 类 就类似于建筑设计图纸,而实例化出来的对象按照图纸设计出来建筑.且具有类的统一信息.
class  Student //学生类
{
public:
	void showInfo();
	char* _name; //学生信息
	char* _sex;
	int _age;
};
int main()
{
	Student man; //实例化对象
	man._name = "张三"; //改变对象信息
	man._sex = "男";
	man._sex = 18;
	return 0;
}

6. 类对象模型

6.1.类对象的存储方式

image.png
C++中成员函数和非成员函数都是存放在代码区的。
**结论:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐 注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。 **

7. this关键字

形参和实参的位置不可以添加加,但是类成员函数中可以使用 this关键字,这是因为类成员函数中包含隐式形参就是调用此函数时的该类。

  1. this指针存在那里? ---- 栈,因为它是隐含形参 / VS下面是通过ecx寄存器。
  2. 空指针问题

Date* ptr = nullptr;
ptr->func(); -----正常运行。func()函数是在代码段中,且该函数无形参。
ptr->init(); ----- 运行崩溃。init()具有形参,使用形参时解引用了空指针。
(*ptr).func() -----正常运行。
ptr->_year ----编译错误。 对空指针进行了解引用。

注意,有没有解引用的行为,取决于右边的对象是否存在于实例对象中。

7.1 this指针的特性

  1. this指针的类型 : 类类型* const.
  2. 只能在成员函数中使用.
  3. this指针本质上是"成员函数" 的形参,且对象中不存储this指针.

8. 简单谈一谈封装

封装,就好似电脑,电脑一切信息被机箱包裹,而看不到内部部件.不破除这层封装无法查看内部部件.

C:

  1. 数据和方法是分离的。
  2. 数据访问控制是自由的,不受限制的

C++:

  1. 数据和方法都封装到类里面的
  2. 控制访问方式。愿意给你访问的共有,不愿意给你访问的私有
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值