1、前言
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
我们来举列子说明一下:
比如蒸米饭这件事,C语言关注的就是,淘米 -> 加水 -> 加米 -> 起锅 -> 烧锅 -> 水沸腾 -> 放入盛有生米的盆 -> 烧锅 -> 拿出;C++在这里关注的是对象:人、米、水、电饭煲,人不需要知道电饭煲如果工作的,只需要四个对象之间交互完成任务就可以。
2、类的引入
C语言结构体(struct)中只能定义变量。
而在C++中,新增加了玩法,结构体内不仅可以定义变量,也可以定义函数。
举例:
struct Person { void personInit() { cout << "void personInit()" << endl; } int _age; char _name[20]; }; int main() { Person p; p.personInit(); return 0; }
上面结构体的定义,在C++中更喜欢用class来代替。
3、类的定义
class className { // 类体:由成员函数和成员变量组成 }; // 一定要注意后面的分号
class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。
类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
3.1 类的两种定义方式
3.1.1 声明和定义全部放在类体中
需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
class Person { public: void PersonInit() { cout << "void PersonInit()" << endl; } private: int _age; char _name[20]; };
3.1.2 类声明放在.h文件中,成员函数定义放在.cpp文件中
注意:成员函数名前需要加类名::
//Person.h class Person { public: void PersonInit(); private: int _age; char _name[20]; }; //Person.c #include "Person.h" void Person::PersonInit() { cout << "void Person::PersonInit()" << endl; }
一般情况下,更期望采用第二种方式。
注意:一般在声明成员变量的时候成员变量前加_(下划线),为区分成员函数的形参(只要能区分就可以,前家下划线是我的一种方式,谷歌C++规范一般喜欢后加_)。
如果成员变量没有特殊标记时,当在成员函数内用到成员变量,并为其赋值的时候,函数会采用局部优先的原理,将自己赋给自己,这样就达不到预期的效果。
4、类的访问限定符
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选
择性的将其接口提供给外部的用户使用。
【访问限定符说明】
1. public修饰的成员在类外可以直接被访问;
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的);
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止;
4. 如果后面没有访问限定符,作用域就到 } 即类结束;
5. class的默认访问权限为private,struct为public(因为struct要兼容C)。
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。
5、类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。
例如:
class Person { public: void PersonInit();//声明 private: int _age; char _name[20]; }; //初始化定义的时候函数名前加 Person::,表明PersonInit是Person类域的 void Person::PersonInit()//定义 { cout << "void Person::PersonInit()" << endl; }
6、类的实例化
用类类型创建对象的过程,称为类的实例化。
在实例化之前,定义出来的类是不占空间的。
例如:
class Person { public: void PersonInit() { cout << "void PersonInit()" << endl; } private: int _age; //声明 char _name[20]; }; int main() { Person::_age = 20; //定义开空间 Person p; return 0; }
在没有实例化p的时候,定义的 class Person 类不会开辟空间。
实例化出了 p 对象,这时 p 是占用实际的空间的,存储了成员变量。(这里实例化后,p也不能直接用_age,因为是私有的,后面会讲如何赋值,打印)。
类就像是设计图。
类实例化出对象就像现实中使用设计图盖房子。
在没有盖房子之前,这块区域没有占空间。
实例化就是按图盖房子,这时就占用了空间。
我们可以使用设计图盖多个房子,这些房子都占空间