赞
踩
目录
模拟一个做饭的场景:
在C语言中,我们可以定义一个主函数,然后按照面向过程的思路,将做饭的各个步骤拆分成不同的函数,每个函数负责一个特定的任务,比如洗菜、切菜、烧火、炒菜等。在主函数中按照顺序调用这些函数来完成整个做饭过程。在这种方式下,我们需要手动管理各个步骤之间的数据传递和调用顺序。
在C++中,我们可以定义一个名为"Chef"的类,这个类可以包含一些属性和方法,比如"洗菜"、"切菜"、"烧火"、"炒菜"等。每个方法可以用来执行特定的任务,还可以采用封装性,将一些私有属性和方法隐藏起来。我们可以实例化一个"Chef"对象,然后调用对象的方法来完成整个做饭过程。此外,我们还可以使用继承和多态性来扩展做饭的能力,比如可以创建一个"ChineseChef"类来继承"Chef"类,并且扩展了一些中式烹饪的方法。
C语言结构体中只能定义变量,而在C++中,结构体内不仅可以定义变量,也可以定义函数。
比如实现栈:
- #include <iostream>
- using namespace std;
-
- typedef int DataType;
-
- struct Stack
- {
- void Init(size_t capacity)
- {
- _array = (DataType*)malloc(sizeof(DataType) * capacity);
- if (nullptr == _array)
- {
- perror("malloc申请空间失败");
- return;
- }
- _capacity = capacity;
- _size = 0;
- }
-
- void Push(const DataType& data)
- {
- // 扩容
- _array[_size] = data;
- ++_size;
- }
-
- DataType Top()
- {
- return _array[_size - 1];
- }
-
- void Destroy()
- {
- if (_array)
- {
- free(_array);
- _array = nullptr;
- _capacity = 0;
- _size = 0;
- }
- }
-
- DataType* _array;
- size_t _capacity;
- size_t _size;
- };
-
- int main()
- {
- Stack s;
-
- s.Init(10);
- s.Push(1);
- s.Push(2);
- s.Push(3);
-
- cout << s.Top() << endl;
-
- s.Destroy();
-
- return 0;
- }
上面结构体的定义,在C++中更喜欢用class来代替。
- #include <iostream>
- using namespace std;
-
- class ClassName
- {
-
- };
-
- int main()
- {
-
- return 0;
- }
其中,class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面的分号不能省略。
类体中内容称为类的成员:
类的两种定义方式:
- #include <iostream>
- using namespace std;
-
- class Student
- {
- public:
-
- void Show()
- {
- cout << _name << "-" << _sex << "-" << _id << endl;
- }
-
- public:
- char* _name;
- char* _sex;
- int _id;
- };
-
- int main()
- {
-
- return 0;
- }
声明放在类的头文件Student.h中
- #pragma once
-
- #include <iostream>
- using namespace std;
-
- class Student
- {
- public:
-
- void Show();
-
- public:
- char* _name;
- char* _sex;
- int _id;
- };
定义放在类的实现文件Student.cpp中
- #include "Student.h"
-
- void Student::Show()
- {
- cout << _name << "-" << _sex << "-" << _id << endl;
- }
C++实现封装的方式:用类将对象的属性与方法结合在一起,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
注意:访问限定符只在编译时有用,当数据映射到内存时,没有任何访问限定符上的区别。
那么,C++中的struct和class的区别是什么呢?
C++需要兼容C语言,所以C++中struct一样可以当成结构体使用。另外C++中struct还可以用来定义类。和class定义类一样,区别时struct定义的类默认访问权限是public,class定义的类默认访问权限是private。
注意:在继承和模板参数列表位置,struct和class也有区别。
面向对象的三大特性:封装、继承、多态。
在类和对象阶段,主要是研究类的封装特性,那么什么是封装呢?
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用户的只有开关机键、通过键盘输入、显示器、USB插孔等,让用户和计算机进行交互,完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。
对于计算机使用者而言,不用关心内部核心部件,比如主板上线路如何布局,CPU内部是如何设计等,用户只需要知道,如何开关机,怎么通过键盘鼠标与计算机交互即可。因此计算机厂商在出厂时,在外部套一个外壳,将内部实现的细节隐藏起来,仅仅对外提供开关机、键盘鼠标插孔等,让用户可以与计算机交互即可。
在C++中实现封装,可以通过类将数据以及操作数据的方法有机结合,通过访问权限来隐藏对象内部实现细节,控制具体哪些方法可以在类的外部直接被使用。
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用::作用域操作符指明成员属于哪个类域。
- #pragma once
-
- #include <iostream>
- using namespace std;
-
- class Student
- {
- public:
-
- void Show();
-
- public:
- char* _name;
- char* _sex;
- int _id;
- };
- #include "Student.h"
-
- // 指明Show属于Student类域
- void Student::Show()
- {
- cout << _name << "-" << _sex << "-" << _id << endl;
- }
用类类型创建对象的过程,称为类的实例化。
- class Student
- {
- public:
-
- void Show();
-
- public:
- char* _name;
- char* _sex;
- int _id;
- };
- void Test()
- {
- Student stu;
- stu._name = "zzl";
- stu._sex = "男";
- stu._id = 001;
- stu.Show();
- }
- #include <iostream>
- using namespace std;
-
- class S
- {
- public:
-
- void Show()
- {
- cout << _id << endl;
- }
-
- private:
- int _id;
- };
类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小?
先定义一个日期类Date:
- 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, d2;
- d1.Init(2022, 1, 11);
- d2.Init(2022, 1, 12);
- d1.Print();
- d2.Print();
- return 0;
- }
- #include <stdio.h>
- #include <cassert>
- #include <malloc.h>
-
- typedef int DataType;
-
- typedef struct Stack
- {
- DataType* array;
- int capacity;
- int size;
- }Stack;
-
- void StackInit(Stack* ps)
- {
- assert(ps);
- ps->array = (DataType*)malloc(sizeof(DataType) * 3);
- if (NULL == ps->array)
- {
- assert(0);
- return;
- }
-
- ps->capacity = 3;
- ps->size = 0;
- }
-
- void StackDestroy(Stack* ps)
- {
- assert(ps);
- if (ps->array)
- {
- free(ps->array);
- ps->array = NULL;
- ps->capacity = 0;
- ps->size = 0;
- }
- }
-
- void CheckCapacity(Stack* ps)
- {
- if (ps->size == ps->capacity)
- {
- int newcapacity = ps->capacity * 2;
- DataType* temp = (DataType*)realloc(ps->array,
- newcapacity * sizeof(DataType));
- if (temp == NULL)
- {
- perror("realloc申请空间失败!!!");
- return;
- }
-
- ps->array = temp;
- ps->capacity = newcapacity;
- }
- }
-
- void StackPush(Stack* ps, DataType data)
- {
- assert(ps);
- CheckCapacity(ps);
- ps->array[ps->size] = data;
- ps->size++;
- }
-
- int StackEmpty(Stack* ps)
- {
- assert(ps);
- return 0 == ps->size;
- }
-
- void StackPop(Stack* ps)
- {
- if (StackEmpty(ps))
- return;
-
- ps->size--;
- }
-
- DataType StackTop(Stack* ps)
- {
- assert(!StackEmpty(ps));
-
- return ps->array[ps->size - 1];
- }
-
- int StackSize(Stack* ps)
- {
- assert(ps);
-
- return ps->size;
- }
-
- int main()
- {
- Stack s;
-
- StackInit(&s);
-
- StackPush(&s, 1);
- StackPush(&s, 2);
- StackPush(&s, 3);
- StackPush(&s, 4);
-
- printf("%d\n", StackTop(&s));
- printf("%d\n", StackSize(&s));
-
- StackPop(&s);
- StackPop(&s);
-
- printf("%d\n", StackTop(&s));
- printf("%d\n", StackSize(&s));
-
- StackDestroy(&s);
-
- return 0;
- }
可以看到,在用C语言实现时,Stack相关操作函数有以下共性:
C++实现:
- #include <iostream>
- using namespace std;
-
- typedef int DataType;
-
- class Stack
- {
- public:
- void Init()
- {
- _array = (DataType*)malloc(sizeof(DataType) * 3);
- if (NULL == _array)
- {
- perror("malloc申请空间失败!!!");
- return;
- }
-
- _capacity = 3;
- _size = 0;
- }
-
- void Push(DataType data)
- {
- CheckCapacity();
- _array[_size] = data;
- _size++;
- }
-
- void Pop()
- {
- if (Empty())
- return;
-
- _size--;
- }
-
- DataType Top()
- {
- return _array[_size - 1];
- }
-
- int Empty()
- {
- return 0 == _size;
- }
-
- int Size()
- {
- return _size;
- }
-
- void Destroy()
- {
- if (_array)
- {
- free(_array);
- _array = NULL;
- _capacity = 0;
- _size = 0;
- }
- }
-
- private:
- void CheckCapacity()
- {
- if (_size == _capacity)
- {
- int newcapacity = _capacity * 2;
- DataType* temp = (DataType*)realloc(_array, newcapacity *
- sizeof(DataType));
- if (temp == NULL)
- {
- perror("realloc申请空间失败!!!");
- return;
- }
-
- _array = temp;
- _capacity = newcapacity;
- }
- }
-
- private:
- DataType* _array;
- int _capacity;
- int _size;
- };
-
- int main()
- {
- Stack s;
- s.Init();
- s.Push(1);
- s.Push(2);
- s.Push(3);
- s.Push(4);
-
- printf("%d\n", s.Top());
- printf("%d\n", s.Size());
-
- s.Pop();
- s.Pop();
-
- printf("%d\n", s.Top());
- printf("%d\n", s.Size());
-
- s.Destroy();
-
- return 0;
- }
感谢大佬们的支持!!!互三啦
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。