C++类与对象(一)
面向对象初步认识
在c语言中,编程是面向过程编程,注重求解问题列出过程,然后调用函数求解问题。
在日常生活中。我们经常会遇到面向过程的问题
手洗衣服就是面向过程
而C++是基于面向对象的。关注的是对象,把事情拆分成多个不同的对象,靠对象与对象之间的交互。
在洗衣服整个过程分成四个对象:人、洗衣机、衣服、洗衣粉
人只需要把衣服和洗衣服丢进洗衣机,然后设定好洗衣机的洗涤步骤,就可以等待洗衣机把衣服洗了并甩干。
整个过程中,只有对象与对象的交互,人不需要关心衣服是怎么被洗干净并且甩干的。
类的引入
在C语言中,如果我们写一个栈,就必须要用到struct
结构体,而这里面只能定义变量。而在C++中,重新赋予了struct
新的权力,就是也能在里面定义函数了。
typedef int DataType;
struct Stack
{
//定义栈的变量
DataType* _array;
int _capacity;
int _size;
//栈初始化
void Init(size_t capacity) {
_array = (DataType*)malloc(sizeof(DataType) * capacity);
if (_array) {
perror("malloc fail");
exit(-1);
}
_capacity = capacity;
_size = 0;
}
//入栈
void Push(const DataType& data) {
_array[_size] = data;
_size++;
}
//获取栈顶元素
DataType Top() {
return _array[_size - 1];
}
//销毁栈
void Destory() {
if (_array) {
free(_array);
_array = nullptr;
_capacity = 0;
_size = 0;
}
}
};
int main() {
Stack s;
s.Init(10);
s.Push(1);
s.Push(2);
s.Push(3);
s.Top();
s.Destory();
return 0;
}
类的定义
在C++中,类的定义一般用class
。
class Myclass {
//一般由成员变量和成员函数构成
int _size;
int capacity;
void Init() {
//......
}
};//跟sturct一样,必须有分号
class是类关键字,Myclass是类名,可以自定义。
类中的内容称为类成员,内部变量称为成员变量,内部函数称为成员函数。
类的两种定义方法
一、声明和定义全部放在类里面。注意:如果将函数的定义放在类里,编译器会将其当做内联函数处理。
class Myclass {
public:
int num;
int size;
//....
public:
int Add(int a, int b) {
return a + b;
}//内联函数
//....
};
二、类声明放在头文件(.h)中,定义放在(.cpp)文件中。
类的声明
class MyClass
{
public:
int Add(int a, int b);
//....
public:
int sum;
int size;
//....
};
类成员的定义
#include "test01.h"
int MyClass::Add(int a, int b) {
return a + b;
}
注意:成员函数前必须加上类名
建议:在个人日常中写题目推荐第一种写法,在项目或者工作中,推荐第二种写法
成员变量命名规则建议
大家看下列函数,是不是非常的别扭,通过Time(int year,int month,int day)
这个函数成员变量赋值,形参和实参完全相同,因此我们要重新给成员变量赋上新的命名规则(习俗)
class Date {
public:
int Time(int year, int month, int day) {
year = year;
month = month;
day = day;
}
private:
int year;
int month;
int day;
};
在每个成员变量加上_
就很容易看懂我们要给那一个变量赋值,提高代码可读性。
class Date {
public:
int Time(int year, int month, int day) {
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
或者这样
class Date {
public:
int Time(int year, int month, int day) {
Ayear = year;
Amonth = month;
Aday = day;
}
private:
int Ayear;
int Amonth;
int Aday;
};
总之,这些命名就是为了区分变量,从而提供可读性,因此可以根据自己的需求来命名。
类的访问限定及封装
访问限定符
说明:
一、public修饰的成员,可以直接在类外面访问
二、protected和private修饰的成员在类外不能直接被访问(此处protected和private的作用是类似的)
三、权限访问限定作用域从该访问限定符出现的位置一直到下一个访问限定符出现位置
四、如果后面没有限定访问符,作用域到’}'(类结束为止)
五、class的默认权限是private,struct默认的权限是public(class和struct的区别)
注意:权限限定符只在编译时起作用,当数据映射到内存后,没有任何区别
封装
封装本质上是一种管理,让用户更方便使用类。
在用户日常使用计算机的过程,通过计算机提供的USB接口,或键盘输入,显示器等交互来完成工作。而实际上,计算机中真正工作的是CPU、GPU等内部元件。
对于用户而言,不需要担心内部的部件,例如主板是如何布线的,CPU内部是如何工作的,用户只需要怎么开关机,怎么通过鼠标和键盘和计算机交互。在计算机出厂时,厂家通过机箱将这些封装好,把内部细节隐藏起来,仅仅对外提供USB接口、开关机按钮等交互接口就可以让用户和计算机交互。
在C++中,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏类内部的实现细节,控制那些方法可以直接被外部使用。
类的作用域
类定义了一个新的作用域,使用类的所有成员,必须要加上类的作用域限定符::
头文件test01.h
定义类
//test01.h
class Date {
public:
int Time(int year, int month, int day);
private:
int _year;
int _month;
int _day;
};
test01.cpp
中声明类的成员
#include "test01.h"
int Date::Time(int year,int month,int day)
{
Date::_year = year;
Date::_month;
Date::_day;
}