C++ 类和对象

一 面向对象和面向过程

1.1 面向过程编程:

面向过程编程是一种基于步骤和过程的编程方法,就像按照菜谱做饭一样。你需要一步一步地描述每个具体的操作。

例子:制作一杯咖啡

  1. 煮水。
  2. 把咖啡粉放入滤纸。
  3. 将热水倒在咖啡粉上。
  4. 等待咖啡滴入杯子。
  5. 加入糖和牛奶(如果需要)。
  6. 搅拌均匀。
  7. 咖啡做好了。

在这个例子中,每一步都是一个独立的过程,程序按照顺序一步一步地执行这些过程,最终完成目标。

1.2 面向对象编程:

面向对象编程是一种基于对象和类的编程方法,就像在一个咖啡店中制作咖啡一样。每一个对象都有自己的属性和行为,你可以通过这些对象来完成任务。

例子:咖啡店制作一杯咖啡

  1. 定义“咖啡机”对象:它可以煮水、过滤咖啡、加热牛奶等。
  2. 定义“咖啡杯”对象:它可以装咖啡、加入糖和牛奶、搅拌等。
  3. 创建一个“咖啡师”对象:他知道如何操作咖啡机和咖啡杯来制作咖啡。

在这个例子中,“咖啡机”、“咖啡杯”和“咖啡师”都是对象,每个对象都有特定的属性(如咖啡机的水温、咖啡杯的容量)和方法(如煮水、搅拌)。通过这些对象的交互,最终完成制作咖啡的任务。

1.3 总结

面向过程编程(POP):专注于过程和步骤,类似于按照菜谱做饭,每一步都是具体的指令。

面向对象编程(OOP):专注于对象和交互,类似于咖啡店中的角色分工,每个对象都有自己的职责,通过对象之间的协作来完成任务。

二 类

2.1 类的引入:

C语言的结构体和C++的类有些许相似但是它里面只能定义变量,在C++的类中不仅可以定义变量而且还可以定义函数在里面

C:

typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

void Init(int month , int year)
{
  ……
}

就比如这个用C语言写的栈,它里面就只能写变量名,函数其他的只能写在结构体外面然后我们再看用C++看它怎么写,看之前先得了解C++的定义

2.2 C++的定义:
class className// 类名
{
// 类体:由成员函数和成员变量组成
};  // 一定要注意后面的分号

C++:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
class Date
{
	void Init(int month, int date)
	{
        date = date;
		//_date = date;
	}
    int date;
    int month;
  
	//int _date;
	//int _month;
};
int main()
{
    Date myDate;
	myDate.Init(2, 3);
	return 0;
}

C++就把它们封装成一个类,但你们是不是发现了一个问题,我想给变量赋值时怎么参数名和变量名一模一样,这是什么鬼?其实这是为了代码的可读性和一致性并且我们一般在变量前面加"_"

输出:

那为什么编译之后会显示找不到Init呢?我不是在类里面写了init嘛,原因就是class默认为private,struct为了兼容C才是public

那什么是private public呢?它就是我们接下来要讲的类的访问限定符及封装

三 类的访问限定符及封装

3.1 类的访问限定符:

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择

性的将其接口提供给外部的用户使用

 public:

当你希望某个类、属性或方法对所有其他代码可见时使用

例子:

#include <iostream>
using namespace std;
class Date
{
public:
	void Init(int month, int date)
	{
		_date = date;
		_month = month;
	}
	void sprint()
	{
		cout << _date << endl;
		cout << _month << endl;
	}
	int _date;
	int _month;
};
int main()
{
	Date myDate;
	myDate.Init(2, 3);
	myDate.sprint();
	return 0;
}

输出:

private:

当你希望某个属性或方法只在类内部使用,外部无法直接访问时使用

例子:

using namespace std;
#include <iostream>
class Date
{
public:
    // 初始化日期和月份的方法
    void Init(int month, int date)
    {
        _month = month;
        _date = date;
    }

    // 打印日期的方法
    void Print() const
    {
        std::cout << "Date: " << _month << "/" << _date << std::endl;
    }

private:
    int _date; // 日期
    int _month; // 月份
};

int main()
{
    Date myDate; // 创建 Date 类的实例
    myDate.Init(2, 3); // 初始化日期和月份
    myDate.Print(); // 打印日期

    // 尝试直接访问私有成员变量(将导致编译错误)
    cout << myDate._date << std::endl;
    cout << myDate._month << std::endl;
    return 0;
}

输出:

错误表示你不能直接访问私有成员变量,如果想访问那只能私有转成公有

 protected:

当你希望某个属性或方法在同包内或者子类中可见,但不希望它被外部类访问时使用。

class Date
{
public:
    // 初始化日期和月份的方法
    void Init(int month, int date)
    {
        _month = month;
        _date = date;
    }

    // 打印日期的方法
    void Print() const
    {
        std::cout << "Date: " << _month << "/" << _date << std::endl;
    }

protected:
    int _date; // 日期
    int _month; // 月份
};

int main()
{
    Date myDate; // 创建 Date 类的实例
    myDate.Init(2, 3); // 初始化日期和月份
    myDate.Print(); // 打印日期

    // 尝试直接访问私有成员变量(将导致编译错误)
    cout << myDate._date << std::endl;
    cout << myDate._month << std::endl;

    return 0;
}

输出:

访问限定符说明:

1. public修饰的成员在类外可以直接被访问

2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)

3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

4. 如果后面没有访问限定符,作用域就到 } 即类结束。

最后让我们用一个形象的例子来结束这一个知识点

有一个家庭,父母有一个私人的保险箱(private),这个保险箱只有父母自己可以打开。父母还有一个家族的相册(protected),家族的相册不仅仅父母可以看,子女也可以看,但家外的朋友是不允许看的。而有一个花园(public),任何人都可以进入和观看。

3.2 封装:

封装(Encapsulation)是面向对象编程中的一个重要概念,它指的是将数据(成员变量)和操作数据的方法(成员函数或方法)封装在一个单元内部,并保护对象不受外部直接访问。这种机制使得对象内部的细节对外部是隐藏的,只能通过定义的公共接口(公共方法)来访问和操作数据,从而实现了数据的安全性和代码的模块化。

四 类的实例化:

4.1 实例化的概念:

在C++中,类是一个模板,它定义了一组属性和行为。但是,类本身并不占用内存空间。只有当我们用类创建对象时,才会分配内存。这种创建对象的过程就叫做“实例化”。

class Date
{
public:
    // 初始化日期和月份的方法
    void Init(int month, int date)
    {
        _month = month;
        _date = date;
    }

    // 打印日期的方法
    void Print() const
    {
        std::cout << "Date: " << _month << "/" << _date << std::endl;
    }

private:
    int _date; // 日期
    int _month; // 月份
};
int main()
{
    Date myDate; // 类的实例化
    return 0;
}

当你写一个类时,只是定义了一个模板或蓝图,描述了对象的属性和行为。这不会占用内存空间

所以说 _date 和 _month都只是声明并不是定义,但想要它有内存空间就需要实例化对象

这个代码就是实例化 Date 类的一个对象:myDate 而_date 和 _month是对象名。

当你实例化一个类时,你实际上是在创建这个类的对象。每个对象都有自己的成员变量的副本,并且可以独立操作这些变量

  • 78
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 41
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

POL.free

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值