类和对象——类的定义、类的封装、类的存储方式
主要介绍了类的定义、类的限定符及其作用域、类对象的存储方式
类是数据和方法的结合体,类似于我们在C 学的 结构体struct
C语言中,结构体只能定义属性/变量
C++中,结构体不仅可以定义变量,又可以定义函数
C++中类和结构体的区别是什么?
struct的默认访问方式是public,class的默认访问方式是private
目录
一、定义类的两种方式
类的基本框架是
class 类名
{
//类体:由成员函数和成员变量组成(默认是private访问)
};
1、方式一:成员函数在类中定义
在类中定义,也就是直接将函数体放在类中
编译器可能会将其当作 内联函数处理
class Person
{
void Print()
{
printf("我是定义在类中的函数");
}
};
2、方式二(推荐):声明放在类中,函数定义放在类外
我们在学习C 的函数时,常常会把函数声明放在.h文件,函数定义放在 .c文件
这里也是一样,类体和成员函数声明放在 .h中,成员函数的定义放在 .c中
定义需要注意的是,由于函数放在了 类中,不能直接使用 void Print(){ } 来定义的话,否则无法找到声明
既然是放在类中,那么我们就加上作用域解析符 :: , 表示 该函数的声明在类中
===================Person.h===================
class Person
{
void Print();
};
===================Person.c===================
//定义 Person 类中的Print()函数
void Person::Print()
{
printf("我是定义在类中的函数");
}
二、 访问限定符及类的封装
1、访问限定符概念
所谓封装,指的是隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。类将数据和方法封装到一起,但不希望外部(类作用域之外)随意访问内部(类作用域范围内),可以通过设置访问限定符 来限制访问权限
访问限定符分为三种:
public:公有,在类外可通过对象访问
private:私有,在类外无法通过对象直接访问
protected:保护,和private类似,在类外无法通过对象直接访问
2、访问限定符的作用域
访问权限作用域:从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
3、类的封装
有了访问限定符,我们可以更高效的管理数据和方法,仅让外界访问必要的内容,重要的内容限制访问权限
所以类的封装就是
将数据和方法 放到类里,可以给你访问的,设置成公有;不可以给你访问的,设置成私有或保护
三、类对象的存储方式
我们以上面的Person类为例
class Person
{
public:
void PrintPersonInfo();
private:
char _name[20];
int _age;
};
一个类就相当于一张房屋设计的图纸
当一个类的对象被创建时,就相当于 房屋被造出来了,也就是类的实例化
房屋被建造出来,必定占用了一定的空间,对象也是如此
那么这个对象是怎么存储的呢??
我们先使用 Person类创建三个对象
#include "Person.h"
int main(){
Person p1;
Person p2;
Person p3;
reuturn 0;
}
1、存储方式
可能你会认为是下面这种,对于相同的函数,每个都要自己存一份,空间利用率低
所以我们索性把 函数定义 丢到公共区,每个对象仅保存自己的成员变量
2、存储空间计算
前面提到,每个对象仅保存成员变量,而函数定义是放在公共区域(代码区)
==》每个对象所占用的空间其实就是成员变量所占的字节大小
我们下面定义三个不同的类
class Person1
{
int _a; //成员变量是int,4个字节
};
class Person2
{
char _a; //成员变量是char,1个字节
};
class Person1
{
//无成员变量
};
然后测试这三个类的对象所占空间大小
int main()
{
Person1 p1;
Person2 p2;
Person3 p3;
cout << "p1 所占空间大小:" << sizeof(p1) << endl;
cout << "p2 所占空间大小:" << sizeof(p2) << endl;
cout << "p3 所占空间大小:" << sizeof(p3) << endl;
return 0;
}
p1、p2我们可以理解,int占4个字节,char占1个字节
但是 Person3是一个空类,为什么还能占一个字节??
==》对象一旦被创建就会被分配地址,p3的1一个字节,只是占位
更多推荐
所有评论(0)