知识点10

面向过程与面向对象的认识:我认为其实就是关注点不同,面向过程注重步骤(需要如何操作,过程是啥),而面向对象关注对象(有多少个体参与进来),但不是说其他就不关注只是侧重点不一样。拿洗衣服来说,面向过程就是拿盆,放水,放衣服,放洗衣粉,手搓等等;面向对象就是有四个对象:人、衣服、洗衣粉、洗衣机,然后四个对象交互完成洗衣服这个过程,在这个过程中,人不需要管洗衣机如何洗衣服的,各司其职,但又相互配合,四个对象只负责自己的事。

知识点11

类的引入:C 语言结构体中只能定义变量,在 C++ 中,结构体不仅可以定义变量,也可定义函数。不过在 C++ 中更喜欢用 class 代替。class 为定义类的关键字,Person为类名,{}中为类主体注意类定义结束后面分号不能省。

类中内容称为类的成员:类中变量称为类的属性或成员变量;类中函数称为类的方法或成员函数。类有两种定义方式:

(1)声明和定义全部放入类体中,注意成员函数如果在类中定义,编译器可能将其作为内联函数处理。

class Person 
{
public:
    //显示基本信息
    void showinfo()
    {
        cout << _name << "-" << _sex << "-" << _age << endl;
    }
public:
    char* _name;    //姓名
    char* _sex;     //性别
    int _age;       //年龄
};

(2)类声明放在 .h文件中,成员函数定义在 .cpp文件中,注意成员函数名前需要加类名 : :。其实就是分开写,只不过需要加类名和 : :。

知识点12

类访问限定符和封装:C++ 实现封装的方式:用类将对象的属性与方法结合在一块,让对象更完善,通过访问权限选择性的将其接口提供给外部的用户使用。

(1)public 修饰的成员在类外可以被直接访问。

(2)protected 和 private 修饰的成员在类外不能被直接访问(此处 protected 和 private 是类似的)。  访问权限作用域从该访问限定符开始到下一访问限定符出现为止,后面如果没有,就到 } 即类结束。

(3)class 的默认访问权限为 private ,struct 为 public (因为 struct 要兼容 C)。

面向对象三大特性:封装、继承和多态。封装:将数据和操作数据的方法进行有机结合,隐藏对象的实现细节,仅对外公开接口来和对象进行交互。

知识点13

类的作用域:类定义了新的作用域,类的所有成员都在其中。在类外定义成员时,需要使用 : :作用域操作符指明成员属于那个类域(就是声明和定义分开写时那种用法)。

知识点14

类的实例化:类是对对象进行描述的,实际并没有分配实际的内存空间,实例化出来的对象,占用实际的物理空间,存储类的成员变量。可以理解为类实例化就是用建筑设计图造房子,类就像设计图。

void Test()
{
    Person man;
    man._name = "jack";
    man._age = 10;
    man._sex = "男";
    man.showinfo();

}

知识点15

类对象存储与大小:只保存成员变量,成员函数存放在公共代码段。一个类的大小就是类中“成员变量”之和,注意内存对齐。类中仅有成员函数或者什么都没有时(空类)时,编译器给了空类一个字节来标识该类的存在。

对齐规则: 

 (1)第一个成员在与结构体偏移量为0的地址处。

 (2)其他成员变量对齐到某个数字(对齐数)的整数倍的地址处。注意:对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。vs默认对齐数为8。

 (3)结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐数取最小)的整数倍。

 (4)如果嵌套了结构体的情况,嵌套结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整倍。

知识点16

this 指针:C++ 编译器给每个“非静态的成员函数”增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体内中所有“成员变量”的操作,都是通过该指针去访问。只不过所有操作对用户是透明的,即不需要用户来传递,编译器自动来完成。

class Date
{
public:
    void Init(int year, int month, int day)
    {
        _year = year;
        _month = month;
        _day = day;
    }

    void Print()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
//  void Print(Date* this) 
//  {
//      cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
//  }编译器会对函数进行处理

    private:
        int _year;
        int _month;
        int _day;
};


int main()
{
    Date d1, d2;
    d1.Init(2022, 1, 11);
    d2.Init(2022, 1, 12);
    d1.Print();    //底层实际是d1.Print(&d1);
    d2.Print();    //同理     d2.Print(&d2);

    return 0;
}

this 指针特性:

(1)this 指针类型:类类型* const ,即成员函数中,不能给 this 指针赋值。

(2)只能在“成员函数”的内部使用。 

(3)this 指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this 形参,所以对象中不存储 this 指针。this 指针是形参,所以 this指针是跟普通参数一样存在函数调用的栈帧里面。

(4)this 指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过 ecx寄存器自动传递,无需用户传递。

更多推荐