本系列文章为c++面向对象的程序设计,首先说一下我对这门课的经历
这门课是小奂在大三期间学习的一门课,记得当时课程上的大作业是利用c++完成稀疏点云高程排序,基于高程赋予加彩色以及对点云进行滤波,最后内插加密生成DEM(这个作业的内容中可能包含了一些专业相关的东西),但底层的语言以及框架就是c++,类与对象;
当时因为这个大作业也挣扎了很久吧,好在最后能够及时完成,也很有成就感吧。同时也对面向对象的很多知识有了理解,毕竟代码这种东西自己写一遍总比书本上的文字强得多。在那之后,这种技能又丢到一边了。现在大四,拿到保研资格有了空闲的时间,同时也有导师的原因,为之后的研究生打个基础,又把这个重新拾起来,把一些基本的东西记录下来同时分享我对这些基本内容的理解,很多东西可能理解的也不是那么深刻(小奂也不是计算机专业)。
首先,在第一篇文章中介绍一些c++与C语言的区别(也就是面向对象的程序设计与面向过程的程序设计到底有哪些不同)
由C语言到C++,众所周知,c++语言是在C语言的基础上发展来的,C语言是一种典型的面向过程的编程语言。C++不仅支持面向过程的编程,同时在此基础上增加了类与对象,类和对象则是所有面向对象编程语言所必备的东西。面向对象的编程语言就是利用类和对象完成所需要的数据操作。
那么什么是对象,什么又是类呢?
简单的来说,客观世界中的任何一个事物都可以看作一个对象。对象包括它的属性和行为两个方面,对于C++语言来说,对象就是数据和函数。
类:是一种抽象的事物,是一系列具有共性事物的本质。
类是对象的抽象,对象则是类的一种特例。
面向对象的程序设计对比面向过程的来说,具有封装、继承与重用、多态性等一系列特性,这些在以后的学习中将会深入的探讨。
对于面向对象有了一个初步的了解后,下面说明一下C++相较于C++做了哪些扩充与删改。由于内容还比较多,大概有十个比较重要,需要大家理解的知识。本篇文章先介绍一下前五个
1、标准输入输出流(头文件 #include<iostream>)
熟悉C语言的小伙伴都知道C语言中使用printf()和scanf()进行数据的输入与输出进行人与计算机之间的交互。而C++中则采用cout和cin作为标准的输入和输出,标准输入输出流与printf()和scanf()比较,省去了繁琐的利用格式字符串指定输出的类型(%d,%f,%c等),C++系统则会自动按数据的类型进行输出,更为方便简洁。
若需要指定输出所占的列数,可以使用控制符setw进行设置(需要使用头文件iomanip.h)。例如:setw(5)表示为输出数据预留五列的空间。
对应的输出结果:
可以看出,cout和cin的输入更加简单灵活;
对于setw控制符,由输出结果可知,若所预留的列数大于数据的位数,则会在数据前利用空格进行占位,若所预留的列数小于数据的位数,则会把数据完整的输出。
2、const定义常变量
在C语言中,相信大家都见过#define,用来定义符号的常量。define的本质是在预编译时对字符进行置换。
例如 #define pi = 3.14159 就是把程序中的pi全部置换为3.14159.在编译之后,程序中就不存在pi这个变量,没有类型,也不占用存储空间,这在编写程序程序就很容易出错和造成混乱。C++语言针对这个问题也做出了相应的调整,那就是const 定义常变量。
const float pi=3.14159
此时定义的常变量pi具有变量的属性,有自己的数据类型,占用存储空间,有地址,可以用指针指向它。用const定义的变量在运行期间的值是固定的,不能改变的。
因此,一般把程序中不允许改变值的变量定义为常变量。
3、函数原型的声明
在C语言中,如果函数的调用的位置在函数定义之前,则应在调用函数之前对所调用的函数进行声明。但如果所调用的函数是整型的,也可以不进行函数的声明。
int max(int x,int y); //max函数原型的声明
int max(); //不列出max函数的参数表
max(); //若max是整型函数,可以省略函数类型
以上几种声明的形式在C语言中都是合法的,但在C++程序中,函数调用之前必须对所调用的函数作函数原型声明,这不是建议性的而是强制的。
函数类型 函数名(参数表);
4、函数的重载
重载是C++语言一个重要且基本的特性,即对同一事物在不同条件下赋予不同的涵义,实现“一物多用”。
函数重载:C++允许在同一作用域中用同一函数名定义多个函数,这些函数的参数个数和参数类型不相同,这些同名函数用来实现不同 功能。
函数p1为被重载的函数,分别对于整型,单精度,双精度三种不同数据类型进行一组数从大到小的排列。具体的函数定义如下:
4.1整型:
4.2单精度
4.3 双精度
此程序,当输入的数据为整形时,调用p1(),系统则会自动进行判断选择调用整型函数p1;
当输入的数据为单精度形时,调用p1(),系统则会自动进行判断选择调用单精度函数p1。
5、函数模板
学习完函数重载可以实现一个函数名多用,将实现相同或类似功能的函数用同一个函数名来定义。这样可以在调用同类函数时含义清楚,方法简单。但仍需要在程序中对每一个函数都进行相应的定义,即使只是形参的类型不同,也需要分别定义,在有些时候还是比较繁琐麻烦的。
为了对这个问题进行改进,C++提供了函数模板。
函数模板:实际就是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用模板就成为函数模板。
凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用该函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同的功能。
通用函数定义: template <typeneame T>
template的含义就是模板,尖括号中先写关键字typename,后面跟一个类型参数T,T就是一个虚拟的类型名,并未指定它是哪一种确定的类型。
定义函数模板max
主函数对模板函数进行调用,模板函数max会根据传入实参的数据类型确定T的类型。
输出的结果,符合预期的结果,但使用函数模板很容易发现,代码量远远小于使用函数重载,因此在一些场合灵活使用函数模板可以大大减少工作量,提高代码的效率。