文章目录
- 一、面向过程和面向对象
- 二、类
一、面向过程和面向对象
c语言是面向过程的编程语言 c++是面向对象的编程语言
面向过程:关注过程,对于求解问题的不走,调用函数逐步解决问题 就洗衣服来说:洗衣服需要放水,倒洗衣粉,排水,甩干,晾衣服
面向对象:关注的是对象,在洗衣服这一整体来说,参与的对象有人,洗衣粉,洗衣机,衣架(注重的是哪些参与了)关注的是对象 一个外卖系统
面向过程 点餐、上架、派单、送餐(关注过程步骤) 面向对象:
关注整个外卖系统它的对象是哪些(商家、用户、骑手)它们之间的关系,对象和对象之间的交互 将现实世界类和对象映射到虚拟计算机系统
二、类
c++兼容c语言以前的语法,struct以前的用法在c++也可以用 但是在c++中,将原本c语言中的结构体(struct)升级为了类
而在c++中,以class来代替struct作类
类:class为类的关键字,class className
class表示为类,className为类名
#include<iostream>
using namespace std;
struct Stack
{
int* a;
int top;
int capacity;
};
int main()
{
//c语法
struct Stack st1;
//c++将struct升级为类,此时Stack为类名,可以直接用其来定义变量(对象)
Stack st;
return 0;
}
类域
类形成了一个新的作用域:类域。不同类有各自不同类域,就像不同函数有不同局部域一样, 所以在不同类中定义重名成员不构成重定义
类中成员当前面的成员访问在它后面的成员是,不需要提前声明,因为类域是一个整体,在类域中访问它的成员可以随时访问
类域是一个整体不分前后访问顺序,类中前面的成员可以访问在其后面的成员
而类它的成员较结构体新增了成员函数(方法),可以在类中直接定义函数
以栈为例
struct
struct Stack
{
//在一般情况下还需要在前面加栈的前缀,但是现在就在这个类中直接将栈的实现写出
void Init(int defaultcapacity = 4)//类成员函数(方法)
{
a = (int*)malloc(sizeof(int) * defaultcapacity);
if (nullptr == a)
{
perror("malloc fail\n");
return;
}
top = 0;
capacity = defaultcapacity;
}
void Push(int x)
{
//...扩容
a[top++] = x;
}
void Destroy()
{
free(a);
a = nullptr;
top = capacity = 0;
}
int* a;
int top;
int capacity;
};
int main()
{
Stack st;
st.Init();
return 0;
}
class
#include<iostream>
using namespace std;
class Stack
{
public:
//在一般情况下还需要在前面加栈的前缀,但是现在就在这个类中直接将栈的实现写出
void Init(int defaultcapacity = 4)
{
a = (int*)malloc(sizeof(int) * defaultcapacity);
if (nullptr == a)
{
perror("malloc fail\n");
return;
}
top = 0;
capacity = defaultcapacity;
}
void Push(int x)
{
//...扩容
a[top++] = x;
}
void Destroy()
{
free(a);
a = nullptr;
top = capacity = 0;
}
int* a;
int top;
int capacity;
};
int main()
{
Stack st;
st.Init(4);//不可访问,当加了权限访问符(public)就可以访问了
return 0;
}
可以发现,struct关键字定义的类可以通过,而class定义的类无法通过,且class定义的类报了个无法访问的错误
访问权限
那是因为类有访问权限,三大访问权限
public:公开权限,外部用户可以访问到类中成员
protected:将类中成员保护起来不让类外部成员访问
private:只能在类域中访问,类域之外无法访问
以struct关键字作为类,它的默认访问权限是公开的(public)权限
以class关键字作为类,它的默认访问权限是私有的(private)权限所以一般情况下,要让类之外使用到类中的哪些成员,需要用public权限访问
访问权限作用域为多大?访问权限作用域从访问符出现的位置起到下一个访问权限限定符出现的位置为止,
如果之后一直没有出现下一个访问权限限定符,那么直到类域结束
public到private之间的类成员是公开的,类之外能访问,而public访问的权限到private为止
封装
类将数据与实现这些数据的方法封装起来,用类将对象的属性(数据)与方法(成员函数)结合起来,让对象更加完善
将数据与方法封装起来,那么在外部用户访问它时它可以指定将哪些成员开放让别人访问到,也可以使不想让外部用户访问到的成员隐藏起来,那么类是如何使它的成员可以让别人访问与否?加访问权限
类成员函数声明与定义
那么类,它的成员函数可以将声明和定义分离吗?可以 在类中声明的函数在类域之外定义需要有作用域限定符::代表它是类的成员函数,
且在函数实现时
函数中的变量来自于类的话,它要去类中找,当表明这个定义的函数是类中的成员函数是,在函数中 的变量先在函数中找,然后在类域找最后全局找
在类域外边定义函数,函数前指定类域代表这个函数也就不是普通函数了,而是类中一个成员函数的定义而且类的成员函数,定义和声明没有分离时,这个函数就是内联函数,当然只是建议编译器这个函数为内联函数
如果代码量特别大,编译器也不会接收这个建议
类成员名一般规则
类成员变量一般以_作为前缀,由于类成员函数在定义时,有可能会定义与成员变量重名,所以类,成员变量一般以_开头
#include<iostream>
using namespace std;
class Year
{
public:
void is_year(int year)
{
//先用局部域在用类域
_year = year;
cout << _year << endl;
}
int _year;
};
int main()
{
Year y;
y.is_year(2002);
cout << y._year << endl;
return 0;
}
类实例化
类中成员变量只是有一个声明,并没有定义,所以没有开空间 相当于房子,只是有图纸,还没有建成真是的房子,还不能住人
只有声明并不能给声明的变量赋值,将其对象定义出来才是类的实例化
没有将类对象实例化出来,就访问它的成员变量,根本访问不到,相当于图纸上面画了有房子,但是现实世界中并没有将其建造出来,而仅凭一张图纸,是找不到房子的