前言:(C)面向过程 和(C++)面向对象 初步认识
- C语言 面向过程,关注的是 过程 。
分析出求解问题的步骤,通过函数调用逐步解决问题。
用洗衣服来做个例子:
- C++ 基于面向对象,关注的是 对象 。
将一件事情拆分成不同的对象,靠对象之间的交互完成。
整个过程主要是:人、衣服、洗衣粉、洗衣机四个对象之间交互完成的,人不需要关心洗衣机具体是如何洗衣服的,是如何甩干的。 对象具体怎么完成的,那是它的事情。
前言:类的引入
- C语言结构体:只能定义变量由于结构体中只能定义变量,导致函数只能在结构体外定义
- 导致数据和方法分离,所以必须带参数 才能访问在结构体中定义的变量 。
- 函数写在全局,必须加前缀(C中不支持同名【函数重载】)
一、类的介绍
为了更方便使用,有了 类的产生:
C++兼容C语言struct的所有用法。 在C++中,结构体内不仅可以定义变量,也可以定义函数。
结构体struct同时升级成了类:
类[ 类型 ] = 结构体(变量定义)+ 函数定义
- 类名就是类型,Stack就是类型,不需要 struct( 直接当类型来用 )
- 类里面定义函数
- 类也是个域
C++中Stack
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++与C 进行对比
上面结构体的定义,在C++中更喜欢用class来代替
二、类的定义
(一)class 语法
// class :定义类的关键字,ClassName :类的名字
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
- class 定义类的关键字
- ClassName 类的名字
- {}中为类的主体:类体中内容称为类的成员:
- 类中的变量 称为 类的属性 或 成员变量 。
- 类中的函数 称为 类的方法 或者 成员函数。
- 注意类定义结束时 后面分号不能省略。
(二)类的两种定义方式:
- 声明和定义全部放在类体中
需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
- 类声明 放在
.h
文件 中,成员函数定义 放在.cpp
文件 中,
成员函数名前需要加类名::
- ★ 正确的用法:
- 长的函数声明和定义分离
- 短小的函数 可以直接在类里面定义
默认直接在类里定义的 就是 inline。( 到底展不展开,取决于编译器是否认为其长不长 )
(三)成员变量命名规则的建议:
这里会出现什么问题
class Date { public: void Init(int year /*函数参数*/ ) { // 这里的year到底是成员变量,还是函数形参? year = year; } private: int year; /*成员变量*/ };
结果
- 都会现在所在的域中先找
改进:一般,成员变量 加个区分
- [
_
表示内部的]
- _year 【 最常用 】
- year_
- [
m
member 成员]
- m_year
- mYear 驼峰命名法
其他方式也可以的,主要看公司要求。一般都是 加个前缀 或者 后缀标识区分就行 。
class Date { public: void Init(int year) { _year = year; // } private: int _year; }; // 或者这样 class Date { public: void Init(int year) { mYear = year; // } private: int mYear; }; // 其他方式也可以的,主要看公司要求。一般都是加个前缀或者后缀标识区分就行
三、类的访问限定符及封装
(一)访问限定符
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用 。
(二)访问限定符说明
- public (公有)
public修饰的成员 在类外可以直接被访问
- protected(保护)
- private(私有)
protected(保护) 和 private(私有) 修饰的成员 在类外不能直接被访问 ( 此处 protected 和 private 是类似的,真正要区别二者要到继承 )
- 访问权限 作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
- 如果后面没有访问限定符,作用域就到 } 即类结束 。
- class 的 默认访问权限 为 private,struct为public 【 因为struct要兼容C 】
【 注意:访问限定符 只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别 】