【c++学习笔记】类

一.基本概念

  • 在c语言中,结构体就是将相同或不同属性的类型数据放在一起,而里面并不能定义函数,但是在c++当中,结构体里面不仅可以定义不同类型的数据,还可以定义用来操作这些数据的方法(函数),在c++当中更喜欢用class来代替struct定义结构体。
    **注:**class定义的结构体,成员默认是private;struct定义的结构体,成员默认是public
struct student
{
    char name[20];
    char gender[3];
    int age;
};

class student2
{
    char name[20];
    char gender[3];
    int age;

    int add(int left, int right)
    {
        return left + right;
    }
};

int main()
{
    student s1;//这里再定义结构体变量时不像c语言那样还要加struct
    s1.age = 10;
    student2 s2;
    s2.age = 20;//这里编译器会报错

}
  • 在c++中结构体更喜欢叫类,class位定义类的关键字,类中的数据称为类的属性或者类的成员变量;类中的函数称为类的方法或者类的成员函数。

二.了解封装的思想

  • 封装:隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互,将数据和操作数据的方法进行有机结合。
    注:函数就是封装的一种形式,函数中的语句被封装在函数本身这个更大的实体当中,被封装的实体隐藏了他们的实现细节,可以调用该函数但是不能够访问函数中的语句。

  • 访问限定符:public(公有)成员可以在类外直接访问,protected(保护)和private(私有)成员在类外不能访问。
    注:

    1. 访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。
    2. 成员变量在类中具有全局作用域,因为编译器在编译类时,不是从前到后编译,而是先编译成员变量,所以说,成员变量在类中具有全局作用域。

三:类的对象模型

  • 用类类型创建对象的过程,称为类的实例化
  • 类的对象模型:类中各成员在内存中的布局形式

因为类中不仅有成员变量,还有成员函数,那么一个类的对象到底包含了什么?

  • 存储方式一
    这里写图片描述
    缺陷:每个成员变量是不同的,但是函数都是相同的,如果一个类创建多个对象,每个对象都要保存一份函数代码,这样太浪费空间了。
  • 存储方式二
    只将代码保存一份,创建对象时多给一个指针,存放函数表的首地址
    这里写图片描述
    方式二明显比方式一节省了很多空间,但是对象中还是多了一个指针。

  • 存储方式三
    这里写图片描述

但是如果按照方式三来存储,对象怎么找到成员函数呢?

  • 总结:测试环境:vs2013
class student
{
public:
    void SetStudentInfo(const char* name, const char* gender, int age)
    {
        strcpy(_name, name);
        strcpy(_gender, gender);
        _age = age;
    }

    void PrintStudentInfo()
    {
        cout << _name << " " << _gender << " " << _age << endl;
    }

private:
    char _name[20];
    char _gender[3];
    int _age;
};

int main()
{
    student s1, s2, s3;

    s1.SetStudentInfo("王二狗", "女", 12);
    s2.SetStudentInfo("哈哈", "男", 8);
    s3.SetStudentInfo("呵呵", "男", 9);

    cout << sizeof(s1) << endl;
}

上面的代码打印出的结果位28,可以得出,计算机确实是按照方式三来存储的,至于怎么找到成员函数,下回分解^_^!

猜你喜欢

转载自blog.csdn.net/virgofarm/article/details/80668305