c++类和对象的初识

面向对象

面向对象是程序设计的思想, 或者说是软件开发的方法.
在面向对象语言中, 引入了类和对象的概念. 所谓类就是对同种个体的抽象集合, 而对象就是类中的一个实体; 所以类和对象有着 “类是对象的抽象, 对象是类的实例” 的关系. 这其实是将现实世界中的关系和特性引入到了计算机世界中, 这让我们在程序设计时有了更合理的分析和管理思想, 将程序中的一些具有同种属性和行为的实体集合抽象成一个类, 然后通过类产生解决实际问题的对象, 然后通过封装来隐藏内部细节, 通过继承来实现类的特化/泛化, 通过多态实现基于对象的动态分派.
与面向过程不同, 面向过程更注重的是解决问题的步骤流程, 而面向对象更注重的是解决问题的封装构建和管理分派. 当然, 两者各有优劣, 面向过程的性能高, 没有对象的开销, 在Linux/Unix中一般采用面向过程, 性能是最重要的因素; 但是不易维护, 不易复用, 不易扩展. 面向对象有封装, 继承, 多态的特性, 能设计出"高内聚, 低耦合" 的系统, 易维护, 易复用, 易扩展且更加灵活; 但是性能要比面向过程低.

类和对象

相比与C语言, c++引入了类和对象的概念; 类其实就是在结构体中加入了成员函数, c++中既可以用 struct, 也可以用 class, 但两者的默认访问限定符不同, 为了兼容C语言, struct默认访问限定符为public, 而class默认是private.

并且类中的成员函数, 在代码量相对来说不大的情况下会默认为内联函数(inline), 但是在实际开发的过程中, 并不建议所有的成员函数的实现都放在类中, 一般来讲会将代码量较小的函数的实现放到类中, 而代码量较大的会放到类外去实现.

通过定义类的访问限定符来实现一定意义上的封装, 比如说通过private来限定成员变量的访问权限, 实例出来的对象就不能直接访问private成员.

类对象大小的计算:
这和在C语言中计算结构体的大小有异曲同工之处, 只不过在c++中多了成员函数, 但是其实成员函数是不占用对象的空间的, 这是因为成员函数在内存中的存储方式决定的:
c++类和对象的初识_第1张图片
成员函数是存储在代码段的, 不会在栈中开辟空间, 而是在对象调用函数时, 都去调用这个公共的函数代码段. 因此简单来讲, 对象的大小其实就是成员变量的大小(存储方式依然按照内存对齐); 但是空类的大小有点特殊, 编译器为空类分配一个字节来唯一标识这个类.

内存对齐就是变量数与最大对齐数(类型最大者和编译器默认对齐数的最小值)的之积 — vs默认对齐数为8, gcc默认对齐数为4.

this指针:
我们知道, 类中的成员函数是同一放到代码段的, 为了让函数体是区分不同对象的操作, c++编译器会为每个成员函数增加一个隐藏的this指针, 让这个指针指向当前对象(函数运行时调用该函数的对象), 然后在函数体中通过this指针对属于该对象的变量进行操作. 只是这个操作对用户来说是透明的, 不需要用户手动传递, 由编译器自动完成.

特性:

  1. this指针的类型:类类型* const
  2. 只能在“成员函数”的内部使用
  3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
  4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

你可能感兴趣的:(c++,C++的故事有点长,c++类和对象的初始)