【C++学习笔记】类

一、类的概念

在C语言中,“数据”和“函数”是分开的,为了支持“数据和函数”的关联性,C++里引入类,让所有的数据有一组“分布在各个以功能为导向的函数中”,它们处理的是共同的外部数据。类的关键字是class。

class className
{
    //类体:由函数和变量组成
};
  • class为定义类的关键字
  • className为类的名字
  • {}为类的主体
  • 类中的数据称为类的属性或者类的成员变量
  • 类中的函数称为类的方法或者类的成员函数

    注意:类定义结束时后面有分号

    C语言和C++中struct的区别
    C语言中的结构体里不可以定义函数,而C++里可以定义函数。C++里之所以保留结构体,目的是为了兼容C语言。
    C++中struct和class的区别
    C++中struct默认成员权限为public,而class中默认为private,在C++中定义结构体,更喜欢用class来定义。

二、封装

函数是封装的一种形式,函数中的语句被封装在函数本身这个更大的实体,被封装的实体对外隐藏了具体实现细节,可以调用该函数但不能够访问函数中的语句。

封装:隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互,将数据和操作数据的方法进行有机结合。

三、类的访问限定符
  • public
    public成员在类外可以直接访问。
  • protected
    protected不可以在类外直接访问,和private类似
  • private
    private成员也不可以在类外直接访问

private和protected的区别:pivate和protected都是对类的限制,限制访问类中属性的访问权限,区别在于private只能自己用,别的类都不能使用,protected在于其他派生类都可以使用,派生类就是指子类。

**注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。

如何在类外访问一个类中私有成员变量:可以在类里定义一个公有的函数,类外通过这个函数接口访问该类中私有成员变量。

四、类作用域

类定义了一个新的作用域,类的所有成员都必须在类的作用域中。在类外定义成员,需要使用::作用域解析符指明成员属于那个类域。在类的作用域中,只能通过对象(或指针)借助成员访问操作符.和->来访问类成员。跟在访问操作符后面的名字必须在相关联类的作用域中。

注意:成员变量在类中具有全局作用域

五、类的实例化
  • 用类类型创建对象的过程,称为类的实例化。
  • 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有实际分配内存空间来存储它
  • 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间存储类成员变量
六、类的对象模型

类对象模型:类中各成员在内存中的布局形式。

#include <iostream>

using namespace std;

class Person
{
public:
    void SetPersonInfo(const char* name, const cha
r* gender, int age)
{
    strcpy(_name, name);
    strcpy(_gender, gender);
    _age = age;
}
    void PrintPersonInfo()
{
    cout<<_name<<" "_gender<<" "<<_age<<endl;
}
private:
    char _name[20];
    char _gender[3];
    int _age;
};
int main()
{
    Person p1,p2,p3;
    p1.SetPersonInfo("熊大", "公", 5);
    p2.SetPersonInfo("熊二", "母", 5);
    p3.SetPersonInfo("Peter", "男", 18);
    p1.PrintPersonInfo();
    p2.PrintPersonInfo();
    p3.PrintPersonInfo();

    return 0;
}

存储方式一:
这里写图片描述
缺陷:每个对象中成员变量是不同的,但是函数都是相同的,如果一个类创建多个对象,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。
存储方式二:
这里写图片描述
方式二比方式一明显节省空间,但每个对象中还是多了一个指针。
存储方式三:
这里写图片描述
计算机到底按那中方式存储的,我们来看一个例子:

// 类中既有成员变量,又有成员函数
class A1
{
public:
    void f1()
    {}
    void f2()
    {}
private:
    int _a;
};

// 类中仅有成员函数
class A2
{
public:
    void f1()
    {}
    void f2()
    {}
};

// 类中什么都没有---空类
class A3
{};
  • sizeof(A1) :4
  • sizeof(A2) :1
  • sizeof(A1) :1
    我们看到计算机是按照方式3进行存储的,那它是怎样找到成员函数的呢,我们在this指针那块在进行具体分析。
七、类的存储

类的存储方式:一个类的大小,实际就是该类中“成员变量”之和,当然也要进行内存对齐,注意空类的大小。(暂时不讨论虚函数)

C++中空类/空结构体的大小:空类的大小为1,为什么不是0呢,是因为空类被编译器插进去的一个char,使得这个class的不同实体(object)在内存中配置独一无二的地址。也就是说这个char是用来标识类的不同对象的 。

VS2013下,C语言不允许定义空的结构体

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值