相交于C语言面向过程,关注的是过程来说,C++面向的是对象,更加关注对象,本文将初步对类与对象进行简单介绍。
一、类与对象的定义
(一)什么是类与对象
类是一种抽象的感念,具有相同特性(成员变量,即类的属性)和行为(成员函数,即类的方法)的对象的抽象就是类。类以数据为中心,把相关的一批函数组成为一个整体。
对象是一种具体的概念,对象是人们要进行研究的任何事物,如果把类看做一个是数据类型,那么对象就是乡相应类型的变量。
类的实例化就是对象,对象的抽象就是类,如果把人比作一个类,那么具体到哪一个人则是一个对象,所有的对象都符合这个类的标准,他们具有相同的属性(都是人),但是具有不同的属性值(姓名、年龄、性别等等)。
(二)定义
定义如下:
class classname
{
//类体;
};
class为关键字,类体由成员变量和成员函数组成,classname为自定义类名称。
类的两种定义方式:
1、声明和定义都放在类体中,编译器可能会将其当做内联函数除处理(在日常练习中常采用此种定义方式)
class person
{
public:
void ShowInformation()
{
cout << _name << "_" << _sex << "_" << _age << endl;
}
private:
char* _name;
char* _sex;
int _age;
} ;
2、声明在.h文件中,定义在.cpp文件中(常在工程中使用)
以下是在.h文件中进行声明
class person
{
public:
void ShowInformation()
private:
char* _name;
char* _sex;
int _age;
} ;
以下是在.cpp文件中对声明的成员函数进行定义
#include "person.h"
void person::ShowInformation()
{
cout << _name << "_" << _sex << "_" << _age << endl;
}
二、类的访问限定符及封装
由上面对类的定义,引出了访问限定符及封装的概念。
(一)访问限定符
1、public(共有):修饰的成员在类外可以被访问
2、protected(保护)和private(私有):修饰的成员在类外不可以被直接访问。(此处的protected与private是类似的)。
3、作用域:从该访问限定符出现开始到下一个访问限定符出现为止。
在C++中struct可以定义结构体也可以定义类,当他定义类时,与class的区别在于,class默认访问限定符为private,而struct默认访问限定符为public(因为要兼容C)。
(二)封装
面向对象的三大特征:封装、继承和多态。
1、什么是封装?
封装实际是将数据与操作数据的方法进行有机结合,隐藏对象的部分属性和细节,对外只公开接口,通过接口来对数据进行操作。
2、为什么要进行封装?
数据隐藏:封装本质上时一种管理,封装可以使数据变的更加安全,只允许类的共有成员函数来访问和操作数据。这样可以避免数据被外部直接访问和修改,提高了数据的安全性。
代码复用:封装将数据和相关操作封装在一个类中,可以提高代码的复用性,减少了重复编写代码的工作量。
简化接口:封装可以隐藏类的实现细节,只暴露给外部必要的接口,降低了外部使用者对类的复杂性和理解成本。
3、C++如何实现封装?
用类将对象的属性(成员变量)与方法(成员函数)结合在一起,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
三、类的实例化
类的实例化如下所示:
//定义一个学生类
class Stu
{
//公有成员函数
public:
void func()
{
;
}
//私有成员变量
private:
char* _name;
char* _sex;
int _age;
};
int main()
{
Stu s1;//s1就是定义的学生类Stu实例化出来的对象
cout << sizeof(s1) ;
return 0;
}
根据以上可知,s1就是我们定义的学生类Stu实例化出来的一个对象,那么这个对象s1的大小是多少个字节呢?以上定义的s1的大小为24个字节,类的大小遵循结构体的大小对齐规则。
对于没有成员变量的类的大小为“1”,这个“1”不是为了存储数据而是占位表示它存在。
空类:没有成员函数也没有成员变量,它的大小为1个字节。
那么会存在一个疑问,为什么s1的大小为24个字节呢?
因为对象只存储成员变量,不会存储成员函数。一个类实例化出来的N个对象,每个对象的成员变量都可以存储不同的值,但是调用的成员函数却是同一个,如果每个对象都存放成员函数,而这些成员函数却是一样的,会浪费空间。