🌈个人主页:羽晨同学
💫个人格言:“成为自己未来的主人~”
面向对象和面向过程初步认识
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数来逐步解决问题。
C++是面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
当然,这样的描述可能有一些宽泛,下面让我们举一个例子来进行说明。
就像是洗衣服:
C语言的面向过程是怎么理解呢?,就像关注的是洗衣服的每个步骤,比如,拿一个盆子,放水,放衣服,
那么C++的面向对象的逻辑就在于,洗衣服总共有四个对象,分别是,人,衣服,洗衣粉,洗衣机。
我们洗衣服的整个过程就是靠着这四个对象来实现的。
类的引入
C语言结构体当中只能定义变量,在C++当中,结构体内不仅可以定义变量,也可以定义函数,比如,之前我们讲栈的时候,用C语言方式实现的栈,结构体中只能定义变量,现在以C++方式实现会发现struct中也可以定义函数。
typedef int DataType;
class stack
{
public:
void Init(size_t capacity)
{
_array = (DataType*)malloc(sizeof(DataType) * capacity);
if (_array == nullptr)
{
perror("malloc fail");
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 = _size = 0;
}
}
private:
DataType* _array;
size_t _capacity;
size_t _size;
};
int main()
{
stack s;
s.Init(10);
s.push(1);
s.push(2);
cout << s.Top() << endl;
s.DesTroy();
return 0;
}
在这段代码当中,我们有几个需要注意的点
首先是class,这个在C++当中的作用是定义结构体,就相当于struct
其次是public 和private的使用,一个将空间定义为私有,一个将空间定义为公有。后面我们将会进行详细的描述。
类的定义
//类的定义
class className
{
//类体:由成员函数和成员变量组成
};//一定要注意后面的分号
class为定义类的关键字,className为类的名字,{}中为类的主体,注意类定义结束之后后面的分号不能省略。
类体中内容称为类的成员,类中的变量称为类的属性或成员变量,类中的函数称为类的方法或成员函数
类的两种定义方式
1. 声明和定义全部放在类体中,需注意,成员函数如果在类中定义,编译器可能会将其当做内联函数来处理。
class Person
{
public:
void showInfo()
{
cout << _name << " " << _sex << " " << _age << endl;
}
public:
char* _name;
char* _sex;
int _age;
};
int main()
{
Person s;
s.showInfo();
return 0;
}
2. 类声明放在.h文件中,成员函数定义放在.cpp文件当中,注意:成员函数名之前需要加类名
#include"Person.h"
void Person::showInfo()
{
cout << _name << " " << _sex << " " << _age << endl;
}
class Person
{
public:
void showInfo();
private:
char* _name;
char* _sex;
int _age;
};
一般情况下,我们更希望经声明和定义进行分离。
成员变量命名规则的建议:
class Date
{
public:
void Init(int year)
{
//这里的year到底是成员变量还是函数形参
year = year;
}
private:
int year;
};
你看,这里就显得特别矛盾,所以,我们更建议采用下面的方法。
class Date
{
public:
void Init(int year)
{
//这里的year到底是成员变量还是函数形参
_year = year;
}
private:
int _year;
};
或者采用下面的方法
class Date
{
public:
void Init(int year)
{
//这里的year到底是成员变量还是函数形参
myear = year;
}
private:
int myear;
};
在这里主要看的是公司的要求。
类的访问限定符及封装
访问限定符
C++实现封装的方式,用类将对象的属性和方法结合在一起,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
访问限定符分为:public 和private
访问限定符说明
- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
- 访问权限作用域从该访问限定符出现的位置开始查到下一个访问限定符出现时为止。
- 如果后面没有访问限定符,作用域就到}就结束了
- class的默认访问权限为private,struct的默认访问权限是public(因为要兼容C)
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。
封装
面向对象的三大特性:封装,继承。多态
在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,晋对外公开接口来和对象进行交互,
所以,封装本质上是一种管理,让用户更方便的使用类
类的作用域
类定义了一个作用域,类的所有成员都在类的作用域当中,在类体外定义成员时,需要使用作用域操作符指明成员属于哪个类域
就像我们上面的代码:
class Person
{
public:
void showInfo();
private:
char* _name;
char* _sex;
int _age;
};
#include"Person.h"
void Person::showInfo()
{
cout << _name << " " << _sex << " " << _age << endl;
}
类的实例化
用类类型创建对象的过程,就是类的实例化
1. 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。
2.一个类可以实例化出多个对象,实例化出的对象,占用实际的物理空间,存储类成员变量
这里的报错是因为.进行报错
这是因为person是没有空间的,只有person类实例化出的对象才有具体的年龄
其实就像是什么呢?这个类就是一个设计图,类化出来的对象就是一个实体建筑(根据设计图而来的)。