C/C++基础知识总结——类与对象
1. 面向对象程序设计的特点
1.1 抽象
1.2 封装
1.3 继承
1.4 多态
(1) 分为:强制多态、重载多态、类型参数化多态、包含多态
(2) 强制多态:类型转换
重载多态:
类型参数化多态和包含多态属于一般多态性,是真正的多态。C++中采取虚函数实现包含多态。虚函数是多态的精华。模板是参数化多态的工具,分为函数 模板和类模板
2. 类和对象
2.1 这个理解的比较清楚,就以一个例子说明下用法吧
1 //clock.h 2 3 class Clock 4 5 { 6 7 public: 8 9 void setTime(int newH, int newM, int newS); 10 11 void showTime()//默认为内联函数,也可以前面加inline显示说明 12 13 { 14 15 cout<<hour<<”:”<<minitu<<”:”<<second<<endl; 16 17 } 18 19 private: 20 21 int hour, minute, second; 22 23 } 24 25 //clock.c 26 27 void Clock::setTime(int newH, int newM, int newS) 28 29 { 30 31 hour = newH; 32 33 minute = newM; 34 35 second = newS; 36 37 }
3. 构造函数与析构函数
3.1 构造函数的作用是在对象被创建时利用特定的值初始化构造对象。对象被创建时自动调用。与类同名。没有返回类型。
3.2 如果类中没有写构造函数,编译器会自动生成一个隐含的默认构造函数,参数表和函数体皆为空。如果类中声明了构造函数(不管是否有参数),编译器则不再生成构造函数。
3.3 复制构造函数
(1) 复制构造函数是一种特殊的构造函数,具有一般构造函数的特性,其形参是本类的对象一个引用。其作用是使一个已经存在的对象(由复制构造函数的参数指定)去初始化同类的一个新对象。
(2) 程序员可以根据实际问题的需要定义特定的复制构造函数,实现同类对象之间数据成员的传递。如果程序员没有定义类的复制构造函数,系统会在必要时自动生成一个隐含的复制构造函数。这个隐含的复制构造函数的功能是把初始值对象的每个数据成员的值都复制到新建立的对象中。???
class 类名{
public:
类名(类名 & 对象名);
}
类名:类名(类名 & 对象名)
{
函数体
}
(3) 构造函数在以下三种情况下都会被调用
① 当用类的一个对象去初始化该类的一个对象时
Point a;
Point b(a);
Point c = a;//这两种都能调用复制构造函数,只是写法上不同
② 如果函数的形参是类的对象如:
1 void function(Point a){}; 2 3 int main(){ 4 5 Point a(1,2); 6 7 f(a);//此时 8 9 }
提示:只有把对象用值传递,才会调用复制构造函数,如果传递引用,则不会调用复制构造函数。因此,传递比较大的对象时,传递引用比值传递效率要高
③ 如果函数的返回值是类的对象,函数执行完返回调用者时
1 Point function(){ 2 3 Point a; 5 return a;
6 } 7 8 int main() 9 10 { 11 12 Point b = function(); //此时 13 }
3.4 析构函数
(1) 无返回类型、无参数
(2) ~类名(){};
(3) 先自己析构,再成员析构
3.5 类的组合
(1) 类的组合就是内嵌类,包含与被包含的关系
(2) 创建类的对象时,如果这个类具有内嵌对象成员,则个内嵌对象首先被自动创建。因此即要对本类的基本类型数据成员进行初始化又要对内嵌对象进行初始化。
(3) 形式:
类名::类名(形参表):内嵌对象1(形参表1),内嵌对象2(形参表2),...
{
类的初始化
}
(4) 创建一个组合类对象时,不仅自身的构造函数需要调用,而且调用内嵌类的构造函数,顺序如下:
① 调用内嵌对象的构造函数,调用顺序按照内嵌对象在组合类的定义中出现的顺序,与构造函数初始化列表的顺序无关。
② 执行本类构造函数的函数体
③ 注意:没有默认构造函数的内嵌对象以及引用类型的数据成员必须用初始化参数列表。因为无默认构造函数的必须提供参数;引用型变量必须在初始化时 绑定引用的对象。
(5) 析构函数的析构顺序与构造函数顺序相反
(6) 前向引用声明
① 就是在引用未定义的类之前,将该类的名字告诉编译器,使编译器知道那是个类名
4. 结构体和联合体
(1) 结构体和类的唯一区别就是结构体的默认访问类型是public,类似private
(2) 联合体union:
① 联合体是一种特殊形态的类,可以有自己的数据成员和函数成员,可以有自己的构造与析构函数,可以访问控制权限。默认访问类型是公共类型。
② 联合体全部数据成员共享同一组内存单元
③ 定义方法:
union Mark{
共有成员;
protected:
保护成员;
private:
私有成员;
}
④ 限制:
A. 联合体的个对象成员不能有自定义构造函数、自定义析构函数、重载的复制赋值运算符
B. 联合体不能继承,不支持多态
C. 一般情况下只用联合体来存储一些共有数据,不为他定义函数成员
⑤ 联合体可以不声明名称,称为无名联合体。无名联合体没有标记名,只声明一个成员项的集合,这些成员向具有相同的内存地址,可以由成员项直接访 问,如:
union{ int i; float f; } //程序中可以这样使用 i = 10; f = 2.2;