从零开始的C++(面向过程/对象编程)

面向过程编程:

关注的是问题的解决的过程步骤(事情是如何解决的),算法

面向对象编程:

关注的是解决问题的人(类),具备什么样的数据(成员变量),具备什么样的技能(成员函数)才能解决问题

  1. 抽象:找出一个能解决问题的"对象"(观察研究对象),找出解决问题所必须的数据(属性),功能(成员函数)
  2. 封装:把抽象的结构,归结为一个类(数据类型),然后实例化出类对象,设置对象的属性,调用对象的功能达到解决问题的目的
  3. 继承:在解决问题前先寻找之前的类能不能解决问题,或解决部分问题,如果可以,则把旧的类型继承后再次扩展,来缩短解决问题的时间,降低解决问题的难度。
  4. 多态:对象的多种形态,外部看到一个对象(父亲),当我们向对象发出指令,对象会根据自身情况做出独特反应

一、 类和对象

1、通过分析"对象"的属性和行为设计出一个类
2、类就是数据类型
简单类型:只能表示一个属性(变量),C/C++内建数据类型
数组类型:可以表示多个属性(变量),类型必须相同
结构类型:可以表示多个属性(变量),但缺少行为(函数)
类类型:既能表示属性,也能表示行为,一种复合的数据类型
3、对象就是类这种数据类型创建出的实例,相当于结构变量

	class Student
	{
		成员变量;
		成员函数;
	};
	Student stu;(类对象)

二、类的定义与实例化

1、类的一般形式

class 类名:继承方式 父类
	{
	public/private/protected://访问控制限制符
		成员变量
		//构造函数
		类名(形参表);
		{
		}
		//析构函数
		~类名(void{

		}	
	}

2、类的访问控制限定符
public:公有成员,在任何位置都能访问
private:私有成员,只能自己类的成员函数中访问
protected:受保护成员,只能在自己类和子类中访问
类中的成员变量、成员函数默认是 private(私有的),结构体中的成员变量、成员函数默认是 public.
注意:C++中类和结构的区别只有成员函数和成员变量默认访问权限不同
3、构造函数

  • 什么是构造函数? 类的同名函数就是构造函数,没有返回值
  • 什么时候调用?被谁调用?调用几次 创建类对象时会被自动调用(每创建一个类对象就会被调用一次),对象的整个生命周期中一定会被调用一次,只能被调用一次。
  • 负责干什么
    成员变量的初始化,分配相关资源,设置对象的初始状态
	class 类名:继承方式 父类
	{
	//构造函数
		类名(形参表);
		{
		
		}
	};

4、对象的创建过程

  • 分配类型所需要空间,无论栈还是堆
  • 传递实参调用构造函数,完成如下任务
    1、根据继承表依次调用父类的构造函数
    2、根据成员变量的顺序依次调用成员变量的构造函数
    3、执行构造函数体中的代码
    注意:执行构造函数的代码是整个构造函数的最后一步
    要保证构造函数代码所需要的一切资源和先觉条件在该代码执行前已经准备充分,并得到正确的初始化。
    5、对象的创建方法
    在栈上创建:类名+对象;//若为空则不需要()
    类名 对象(实参);
    在堆上创建:类名* 对象指针 = new 类名;
    类名* 对象指针 = new 类名(实参);
    创建多个对象:
    类名 对象 = {(实参),(实参),(实参)}
    类名* 对象指针 = new 类名[n]{(实参),(实参),(实参)}
    注意:通过malloc创建的类对象不能调用构造函数
    通过new[]创建的对象,一定要通过delete[]释放
    6、类的声明、实现、调用
    1、在头文件中声明
    2、源文件实现类的相关函数
    返回值 类名::函数名(参数列表)
    {
    }
  • 调用时只需要导入头文件,然后与类函数所在的源文件一起编译即可
    注意如果一个类内容不多,可以考虑在头文件中完全实现,也可以只在头文件实现一些简单的成员函数
    注意类中自动生成的函数,在源文件中实现时,也需要在头文件中声明

三、构造函数与初始化列表

1、构造函数可以被重载(同一个名字的函数有多个版本)
2、(缺省构造)无参构造,编译器自动生成的一个什么都不做的构造函数,只能用来避免编译错误
注意:当类中实现有参构造后,无参构造就不会在自动生,如果有需要必须显示的写出来
3、无参构造未必无参,当给有参构造的所有参数设置默认形参,调用这个函数的时候就不需要传参。

注意1:所谓的"编译器生成的XXX函数"其实不是真正语法上的函数,而是功能意义上的函数,编译器作为可执行指令的生成者,他会直接生成具有某项功能的二进制指令,不需要借助高级语言语义上的函数完成任务。
注意2:如果一个类A是其他类成员变量,那么一定要保证他有一个无参构造,当B的构造函数执行时会先执行成员变量的无参构造,而此时类B是无法给类A成员变量提供参数的

4、单参构造与类型转换
如果构造函数的参数只有一个,那么可能Text t=n语句就不会出错,他会自动调用单参构造来达到类型转换的效果
如果想禁止这种类型转换需要在单参构造前加 explicit
5、初始化列表
为类成员进行初始化用的。
对 const 成员初始化的方法
构造函数(参数):成员1(参数),成员2(参数)…
通过初始化列表可以类成员变量传递参数,以此调用类成员的有参构造
初始化列表也可以给 const 成员、引用成员进行初始化
注意:成员的初始化顺序与初始化列表没有关系,而是与在类中的定义顺序有关
注意:初始化列表运行类成员变量还没有定义成功

猜你喜欢

转载自blog.csdn.net/weixin_45050225/article/details/99682000