1.面向过程和面向对象初步认识
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
2.类的引入
c语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。
3.类的定义
//类 class Person { //可以定义成员函数 void Print() { cout << _age << endl; } //定义成员变量时前面建议加_ char _name[10]; int _age; };class为定义类的关键字,ClassName为类的名字,{中为类的主体,注意类定义结束时后面分号。
类中的元素称为类的成员:类中的数据称为类的属性或者成员变量:类中的函数称为类的方法或者成员函数。
类的两种定义方式:
1.声明和定义全部放在类体中,需要注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
//人 class Person { public: //显示基本信息 void showinfo() { cout << _name << "-" << _sex << "-" << age << endl; } public: char* _name; char* _age; int _age; };2.声明放在.h文件中,类的定义放在.cpp文件中。
声明放在类的头文件person.h中
//人 class Person { public: //显示基本信息 void showInfo(); public: char* _name; char* _age; int _age; };定义放在类的实现文件person.cpp中
#include "person.h" //显示基本信息 void Person::showInfo() { cout << _name << "-" << _age << "-" << _sex << endl; }一般情况下,更期望采取第二种方式。
4.类的访问限定符及封装
4.1 访问限定符
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
#include<iostream> using namespace std; class Student { //公有的方法 public: void ShowInfo() { cout << _name << endl; cout << _age << endl; cout << _stuid << endl; } //一般情况下, //成员变量都是比较隐私的, //都会定义成私有或者保护 private: char _name[20]; int _age; int _stuid; }; int main() { Student s1; Student s2; return 0; }【访问限定符说明】
1.public修饰的成员在类外可以直接被访问
2.protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
3.访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4.class的默认访问权限为private,struct为public(因为struct要兼容c)
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
【面试题】
问题:C++中struct和class的区别是什么?
解答:C++需要兼容C语言,所以C++中struct可以当成结构体去使用。另外C++中struct还可以用来定义类。和class是定义类是一样的,区别是struct的成员默认访问方式是public,class是struct的成员默认访问方式是private。
4.2 封装
【面试题】
面向对象的三大特性:封装、继承、多态。
在类和对象阶段,我们只研究类的封装特性,那什么是封装呢?
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
封装本质上是一种管理:我们如何管理兵马俑呢?比如如果什么都不管,兵马俑就被随意破坏了。那么我们首先建了一座房子把兵马俑给封装起来。但是我们目的全封装起来,不让别人看。所以我们开放了售票通道,可以买票突破封装在合理的监管机制下进去参观。类也是一样,我们使用类数据和方法都封装到一下。
不想给别人看到的,我们使用protected/private把成员封装起来。开放一些共有的成员函数对成员合理的访问。所以封装本质是一种管理。
5.类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中**。*在类体外定义成员,需要使用:作用域解析符指明成员属于哪个类域。
#include<iostream> using namespace std; //人 class Person { public: //显示基本信息 void showInfo(); public: char* _name; char* _age; int _age; }; //这里需要指定showInfo属于Person这个类域 void Person::showInfo() { cout << _name << "-" << _age << "-" << _sex << endl; }