类和对象——类的定义、类的封装、类的存储方式

本文详细介绍了C++中类与结构体的区别,包括默认访问权限的不同。同时,讨论了类的封装概念,通过访问限定符控制成员的访问权限。还探讨了类对象的存储方式,强调了函数定义与对象存储的关系,并通过示例展示了类实例化后的内存占用计算。

类是数据和方法的结合体,类似于我们在C 学的 结构体struct

C语言中,结构体只能定义属性/变量

C++中,结构体不仅可以定义变量,又可以定义函数

C++中类和结构体的区别是什么?

struct的默认访问方式是public,class的默认访问方式是private


目录

一、定义类的两种方式

1、方式一:成员函数在类中定义

2、方式二(推荐):声明放在类中,函数定义放在类外

二、 访问限定符及类的封装

1、访问限定符概念

2、访问限定符的作用域

 3、类的封装

三、类对象的存储方式

1、存储方式

2、存储空间计算


一、定义类的两种方式

类的基本框架是

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一个字节,只是占位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值