本节主要有以下内容:
一、类与对象的初步认知
二、类的定义
三、类的作用域
四、类的实例化
五、类的访问限定符及封装
六、类的对象大小的计算
七、类成员函数的this指针
一、类与对象的初步认知
1.类:类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起。
2.对象:对象是具有类类型的变量。
3.类与对象的关系:类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。
二、类的定义
1.类的定义
class classname { //类体:由成员函数和成员变量组成 }; //分号不能掉
【1】class为定义类的关键字;
【2】classname为类的名字;
【3】{}中为类的主体,后面必须跟分号;
【4】类中的元素称为类的成员:类中数据称为类的属性或者类的成员变量,类中的函数类的方法或成员函数。
2.类定义的两种形式
【1】声明和定义全部放在类体中:
注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
class operate { public: int add(int x, int y) { return x + y; } private: int a; int b; };
【2】声明放在.h文件中,类的定义放在.cpp文件中
//.cpp class Operate { public: int Add(int x,int y); private: int a; int b; };
//.h #include "operate.h" int Operate::Add(int x,int y) { return x+y; }
Tip:一般情况下,使用第二种。
三、类的作用域
1.类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 ::作用域解析符
指明成员属于哪个类域。class Person { public: void PrintPersonInfo(); private: char _name[20]; char _gender[5]; int _age; }; void Person::PrintPersonInfo() { cout << _name << " " << _gender << " " << _age << endl; }
四、类的实例化
1.概念:用类类型创建对象的过程,称为类的实例化。
【1】类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;
【2】一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。class Person { public: void PrintPersonInfo() { cout << _name << " " << _gender << " " << _age << endl; } public: char* _name; char* _gender; int _age; }; void Test() { Person man; man._name = "zhangsan"; man._age = 30; man._gender = "male"; man.PrintPersonInfo(); }
五、类的访问限定符及封装
1.访问限定符
【1】 public修饰的成员在类外可以直接被访问。
【2】protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)。
【3】访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。
【4】 class的默认访问权限为private,struct为public(因为struct要兼容C)。注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。
2.封装(面向对象三大特性(封装、继承、多态)之一)
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。我们使用类时将数据和方法都封装一下,不想给别人看到的,我们使用protected/private把成员封装起来。开放一些共有的成员函数对成员合理的访问。所以封装本质是一种管理。
C++通过类,将一个对象的属性与行为结合在一起,使其更符合人们对于一件事物的认知,将属于该对象的所有东西打包在一起;通过访问限定符选择性的将其部分功能开放出来与其他对象进行交互,而对于对象内部的一些实现细节,外部用户不需要知道,知道了有些情况下也没用,反而增加了使用或者维护的难度,让整个事情复杂化。
六、类的对象大小的计算
1.一个类的大小,实际就是该类中”成员变量”之和,当然也要进行内存对齐,注意空类的大小,空类比
较特殊,编译器给了空类一个字节来唯一标识这个类。2.内存对齐规则与结构体内存对齐相同。
七、类成员函数的this指针
1.this指针
class Date { public: void PrintDate() { cout << _year <<"-"<< _month <<"-"<< _day << endl; } void SetDate(int year, int month, int day) { _year = year; _month = month; _day = day; } private: int _year; int _month; int _day; }; void Test() { Date s1,s2; s1.SetDate(2019, 3, 29); s2.SetDate(2019, 9, 24); s1.PrintDate(); s2.PrintDate(); }
如上Date类中有SetDate与PrintDate两个成员函数,函数体中没有关于不同对象的区分,那当s1调用SetDate函数时,该函数是如何知道应该设置s1,而不是s2,为了能够区分,C++编译器给“成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
2.特性
【1】this指针的类型:类类型* const(如上则为:Date*)
【2】只能在“成员函数”的内部使用
【3】this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
【4】this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。