文章目录
面向对象的三大特性:封装性、继承性、多态性。
-
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
-
继承:是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。其继承的过程,就是从一般到特殊的过程。
-
多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术。
类与对象的初步认识:
-
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
-
C++是面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
-
C语言中,结构体中只能定义变量。
-
C++中,结构体内不仅可以定义变量,也可以定义函数。
类的引入:
- C++中,采用class(类)来代替结构体。唯一区别是由class定义的类所有成员的默认访问权限为private,而struct定义的类所有成员默认访问权限为public。
类的定义:
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
class为定义类的关键字,ClassName为类的名字
{}中为类的主体,注意类定义结束时后面分号。
-
类中的元素称为类的成员:
-
类中的数据称为类的属性或者成员变量;
-
类中的函数称为类的方法或者成员函数。
类的访问限定符及封装:
- 类的访问限定符
- public、private、protected。
这些限定符是限定类的,不是限定对象的,只要类型相同就相互访问。
-
public修饰的成员在类外可以直接被访问。
-
protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的) 。
-
访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。
-
class的默认访问权限为private,struct为public(因为struct要兼容C)。
C++作用域(类的作用域)
- C++中的作用域有四类(函数原型作用域、局部作用域、类作用域、命名空间作用域)
- 类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符 指明成员属于哪个类域。
类对象模型
-
C++中的成员变量和成员函数是分开存储的。
-
普通的成员变量存放在对象(变量)中,与结构体变量有相同的内存布局和字节对齐方式。
-
静态成员变量存储在全局(静态)区。
-
成员函数和静态函数存储在代码区。
-
C++的类是用结构体实现的,因此类中的成员变量和结构体里的变量内存布局方式一致。
-
C++类中的成员函数隐式包含一个指向当前对象的指针,哪个对象调用该函数,C++编译器就默认将该对象包含在函数中。
-
静态成员变量和静态成员函数属于类,因此静态成员函数不包含指向具体对象的指针。
-
结构体内存对齐规则:
-
第一个成员在与结构体偏移量为0的地址处。
-
其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的对齐数为8,gcc中的对齐数为4
-
结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
-
如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是 所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
this指针
C++编译器给每个“成员函数“增加了一个隐藏的指针参数,让该指 针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访 问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
- this指针的特性:
-
this指针的类型:类类型* const。
-
只能在“成员函数”的内部使用 。
-
this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this 形参。所以对象中不存储this指针。
-
this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。
类的版式(高质量的C/C++编程)
- 类可以将数据和函数封装在一起,其中函数表示了类的行为(或称服务)。
- 类提供关键字 public、protected 和 private,分别用于声明哪些数据和函数是公有的、受保护的或者是私有的。这样可以达到信息隐藏的目的,即让类仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。我们不可以滥用类的封装功能,不要把它当成火锅,什么东西都往里扔。
- 类的版式主要有两种方式:
(1)将 private 类型的数据写在前面,而将 public 类型的函数写在后面
采用这种版式的程序员主张类的设计“以数据为中心”,重点关注类的内部结构。
(2)将 public 类型的函数写在前面,而将 private 类型的数据写在后面
采用这种版式的程序员主张类的设计“以行为为中心”,重点关注的是类应该提供什么样的接口(或服务)。
重点
C++中struct和class的区别是什么?
答:C++需要兼容C语言,所以C++中struct可以当成结构体去使用。另外C++中struct还可以用来定义类。 和class是定义类是一样的,区别是struct的成员默认访问方式是public,class是struct的成员默认访问方式 是private。
面向对象的三大特性?
答:封装、继承、多态。
this指针存在哪里?
其实编译器在生成程序时加入了获取对象首地址的相关代码。并把获取的首地址存放在了寄存器ECX中(VC++编译器是放在ECX中,其它编译器有可能不同)。也就是成员函数的其它参数正常都是存放在栈中。而this指针参数则是存放在寄存器中。类的静态成员函数因为没有this指针这个参数,所以类的静态成员函数也就无法调用类的非静态成员变量。
this指针可以为空吗?
答、可以为空,当我们在调用函数的时候,如果函数内部并不需要使用到this,也就是不需要通过this指向当前对象并对其进行操作时才可以为空(当我们在其中什么都不放或者在里面随便打印一个字符串),如果调用的函数需要指向当前对象,并进行操作,则会发生错误(空指针引用)就跟C中一样不能进行空指针的引用。