C vs. C++, 关于数据与函数
现在我们要正式进入语言的部分,我首先拿 C++ 语言跟它的前身 C语言 来做一个在 函数以及数据,它们之间的一些角色的不同来做比较。在 C语言、其它语言也一样,概念是一样的。那么在 C语言,你在设计程序的时候,你这边会你会准备一些数据,你会准备一些函数,函数就是来处理数据的,而这个数据就是一个类型,你可能会根据这个数据的类型产生创建出很多真正的数据出来,你的函数就是要来处理这些数据。这样会有一个缺点,由于语言没有提供某些足够的关键字,所以这些数据一定是全局的,因此 各个函数都可以去处理它们,这样在对后面是会有影响的,甚至是有很大的影响,所以后来发展出面向对象语言。 C++ 是第一个最有名的面向对象语言。想法是什么呢? 就是把数据和处理这些数据的函数包在一起,你的数据只有这个函数可以去处理它,其它人看不到,这样不会不会混杂在一起。也许现在各位还不是很能体会它的好处,它是可以带来很大的好处的,因此把这两个东西包在一起,我们就叫做 class,其实 class 也就是以前 c 里面的 struct 结构,只不过它多了更多的特性在里头, C++ 提供了更多的关键字,让我们去使用这些特性, C++ 也有 struct ,所以 C++ 的 struct 都几乎等同于class,它也带着那一些我刚刚说的很好的特性啊,这两者之间呢只是有一点点很微小的差别。数据跟函数包在一起,将来怎么使用呢,就以这个为类型,为一种形式,我们创建出很多很多的对象,然后在这个对象里面再去,程序不外乎是什么,就是你有数据以处理这些数据的方法,就是这些东西,大家感受一下,过去你熟悉的跟现在你要学习的语言的不同。
我们看下一页,刚刚我有提过最经典的一种 对于 class 的分类,有两大经典,一种就是里头带着指针的,一种是里头不带指针的,这个会影响后面的写法啊,影响深远,所以我这边把它分开来。而最有代表性的呢也就是我们要学的例子,一个是复数,一个是字符串。
以复数而言,高中数学我们学过了,复数有实部跟虚部,所以你在设计复数这种东西的时候,你可以想象你在里面要给一个实部,一个虚部。假设这个实部是个整数,虚部是个整数的话,那么我们日后做出来的东西,这里就这个都是复数,它里头就各有一个实部,各有一个虚部,这是它的在内存里面它占用的大小。而你在设计复数的时候,你还要去为它设计它的加减乘除,它的共轭复数,它的正弦函数等等,就是这些黄色的部分要来处理,这里实部虚部。所以你的数据可能有很多份,但是你的函数只有一份,这是合理的,函数的写法都一样啊,所以用一个函数来处理很多的数据,但是你可能会想那把函数跟数据包在一起,却又说数据可以有很多份,函数只有一份,这中间可能你有一个桥梁,你目前还想不透,没有关系哦,后面我们会越来越清楚,这是复数。
而字符串呢它的特别在于字符串里面,比如说叫做 hello world,这样的一个字符串,它的特色是在于它里头其实只有一根指针,那那个 hello world 那个内容在哪里呢,是要靠这个指针指出去,指出去在内存,我们另外设计这个类的人,这个 class 的人另外再去分配这一块空间来放内容,这是上下的很大的一个不同。所以如果我们为这种东西,现在叫 字符串的,这种东西准备了四个字符串的话,它的大小,其实每一个里面都只有一根指针,好大家感受一下,以这张图现在所表现的,我说我有一个类型,这个类型叫 复数,我要产生出四个对象,四个object出来,在语言上就是这样写,下边也是一样,字符串的话呢,我要创建出三个字符串,有这样的写法。这里面有一些,我们后面都会陆续提到,有什么样呢,我现在在提的,我突然又停下来,我是要告诉各位什么,我这边有个红色的,所以创建对象是怎么样的,一种创建方式是有所不同的,不过这个都以后再来说了。
基于对象和面向对象
好所以这一页又再一次的提醒大家,当你去思考,如果你要设计一个类,它里面是有指针,你要非常小心,但我们的第一个例子是没有指针的这一种啊,我们要谈的是复数,我们要谈的是这个东西。
C++ programs 代码基本形式
那在正式开始写程序之前啊,我们来谈一谈一个 C++ 程序的代码的基本形式。你能你会看到的别人写的啊,以及你现在自己准备要开始写的。你会有一个头文件,我们叫做头文件 header, 你会有一个,我们叫主程序啊,这样分并不一定非常精准啊,但是暂时这么说的。主程序怎么去使用头文件,就用 include 的方式,这个在 C语言 已经大家都很熟悉了,用include。include 就是把它含进来,就成为这一部分,所以最后其实是你可以想象它只是一大部分,只是由于角色的区分,所以呢等下你才会感受到角色的区分,所以把它分开来,另外我们的程序也可能会用到标准库,第二种库也是以头文件的形式呈现的,header 头文件,所以我们要用标准库,我们也是把它include进来就可以了。那现在你看到了,如果你要include标准库的话,你要用这种 尖括号 的写法,至于这些标准库放在你的硬盘的什么地方呢,你就可以不用管了,因为你在安装你的集成环境,安装你的编译器的时候,会有一些都步骤呢,已经可以知道,编译器自然知道说你要 include 这一个文件在什么地方,它会去找得到,但是你要用尖括号,而如果你要引出你自己写的东西,你要用这一个呃,双引号啊,就是唯一的区别,在这里这边告诉大家这一种延伸名称,点h啦,点 cpp 啦,不一定是点h或点 cpp ,在不同的平台上面的命名也许不同,甚至于根本就没有这种原产名称都是有可能的。
Output, C++ vs. C
好我们再往下看,目前我们都还没有开始写我们的第一行代码,但是这一页要先跟跟大家介绍,我们后面写代码之后呢,我们可能要输出在画面上,我们要检验,所以这个输出动作是必要的,以前在c的时代,我们要include这个东西啊,有很多种输出方法,但是这是大家常用的一种方法,我们要 include 这一个头文件 stdio.h ,然后里头呢用 printf 去打印出,打印到屏幕上看你想打印什么,这是一种,那现在在 C++ 呢,你仍然可以沿用旧的方法,但是我们有更好的更方便的方法,你只要你要引出第一行的这个 iostream.h,然后你就可以这样子用各位感受一下,这个是不是更自然呢,这什么意思,这个大小于小于这个符号,就好像把东西往左边丢,往往左边丢,那丢到哪里去呢,丢out stay out去,你现在就想象cout的是你的屏幕好了,所以它就往屏幕丢,你要丢什么都可以,你就像这次丢一个字符串,这是丢一个整数,后面等点点点,只要是一些基本类型的东西,统统可以往死要的丢,但是c就不一样了,以前的c我想大家也印象深刻,你要丢什么东西,你得说清楚,你得告诉 printf,说,我现在要丢的是整数还是浮点数还是字符串啊,这个比较麻烦,所以后面的例子,我们比如说我们现在要写一个复数,它有实部虚部,我们去算它的共轭复数之后得到的结果,我想看一看,我就用这种方式把它丢出来,好刚刚有提过这些头文件它的负担,它的延伸名称是在不同的平台上可以不一样,可能不一样,甚至于没有这种延伸名称,这边告诉你,你也可以include的这个把这个点h拿掉,同样的道理在这边它虽然是c的部分,这个点h呢在现在的平台上面,你在工具上面它是把这个点给去掉,不过如果是c的部分的话呢,你上面要加一个,前面要加一个 c,这个是头文件的部分。
Header (头文件) 中的防卫式声明
好这样万事俱备了,我们要开始我们真正第一行代码,我现在要发展的是一个复数,我应该把它放在头文件里头,这就是我要写的头文件的写法呢,有一种非常正规的写法,大家一定要学习起来,这个东西一拿出去,人家一看哇,你这个受过正规训练,你要先这么写,啊为什么要写这个东西呢,因为可能有很多程序要用到你这个头文件,或者你自己你自己的程序也分成很多的文件,也可能会include去用到这个头文件,但include含住了这个次序,如果说要求用的人,它必须c先include a在inclub在incoc,这样对那个使用的人太太太太负担太沉重,对它而言,应该想暗影故事谁都没有关系,次序都没有关系,所以为了这样,我们要写一个防卫士的声明,我们看看它的语法,这种井号开头的就是一个呃,现在先不讲解太多,反正你就当成一个命令,就告诉编译器说,一进来如果不曾经定义过这个东西的话,这个名词的话,那么就把它定义出来,然后继续往下做,这边结束,所以如果是程序第一次引出它,那就做一次,并且这个这个名称,这个名称是我们现在自己取的,就被定义好了,第二次在in crew的时候,这个名这个名词就定义过了,对不对,这个叫做compress这个名词就定义过了,就不会进来,也就是说第二次在include同一个程序里头啊,第二次include时候就不会进到主体来了,这样就不会有重复的include含入的动作,这正是我们教的那一般初学者啦,初学者不会去想到这种事情啊,因为它只会觉得说,反正我写这么一个头文件,我再写一个玩具的一个小程序,我去inclu啊,做完了就ok了,那这样的话你想的就是本体的部分,但是未来进入业界,这正是在做大东西,好东西的时候,你要想到刚刚我说的那些话,所以你要加上这个防卫士的声明好,所以我们现在要发展这个东西,那现在我们写了这一上下两行,跟下面这一行之后呢,接下来的我们的任务就是要开始发展,中间这一块,那这一种头文件写好之后,我们的测试程序啊,在这个地方就要include我们写的这个头文件,这个测试程序所做的动作,你看啊,像这个复数呢,可以把它打印到屏幕上,我们可以复数,可以加五或者是七,加一个复数或者复数相加等等等,都是后面我们在这一块要去实现出来的,好下一步,所以建议大家啊,你写的任何一个头文件,都要加上这一个防卫式的声明。
Header (头文件) 的布局
我们开始发展我们的程序了,上面有这两行,下面有这一行,这是刚刚提过的防卫式的声明。中间这一块我们应该放什么东西呢,我这边标号012,最主要是 1 跟 2 ,1 就是你要写的那个复数的声明,2 就是它的定义,这样讲不是很精准,不过暂时这样的理解,那一二发展之后,你可能要检讨一下啊,有些东西必须在前面先声明过,于是才会写 0 这个部分。
class 的声明 (declaration)
好我们开始发展了,我现在的目标是要带大家去写一个复数。这就是复数的,刚刚说在头文件里面,一这个位置,就这一块。要怎么写它呢,我们现在正式进入语法的部分,任何一个 class 一定有一个 head 头,class head 单独这一行。然后用大括号括起来,这个叫 class body,这里面你就开始要去设计,我的复数应该具备什么样的数据,我应该准备什么样的函数,才能够满足使用复数的人的需求。比如说大家都知道数学里面有共轭复数,所以我应该要在这里面写一个共轭复数这样的函数出来。好我们就开始设计了啊,在这个例子的设计的结果是这样,我们拿这个结果来讲。这里是它的 data,那么上面就是它的函数,这些函数有一些很奇怪的符号,这都是后面一个一个要拿出来谈的。另外这边还有一个奇怪的叫做 friend,你可能设计另外一个类,另外一个单元或者另外一个函数,说它要跟它之间是一个朋友的关系,这些都是后面要提的。我们先用这一张图,总体上让大家理解,类要有这几个部分。
class template (模板) 简介
我们再往下,现在一个一个来谈。那刚刚有提到,又回到上一页来,这个复数理念呢,我们最重要首先要去决定它里面该有什么东西,该有实部虚部,以这个图来看,我让它实部虚部是一个 double 值,这是一个内建的类型 double,如果我要设计另外一个复数,它里头是 floating,是浮点数或者是整数,怎么办,这个已经写死了,就不能动了,那就只好你再写一个 class,这边改成 float,再写一个class,这边改成 int,那你就写了三个 class了,其它的部分都一样,写法几乎都一样啊,你可能有 95% 重复,99% 重复,你只是类型不同而已,所以 C++ 说确实有这个需要,而且不希望你一直在做重复的事情,所以我们就导入了一个观点,叫做模板。
在任何 C++ 语言书籍,或者是你在学校上课,这个模板永远是放在最后面的,可能总共60个小时,要到了第40个小时,或第50个小时才会出现这个主题,但其实我们现在马上就可以带大家感受一下这个主题的意思。我现在的需求是什么,我想把实部虚部的类型不要现在就写死,我想将来用的时候再指定,所以我就说它是什么类型呢啊它是T,其实 T 只是一个符号,你加a也可以,你写代码的时候写a写任何什么都可以啊,这里现在叫 T 表示一个type,大家通常都用t这样子就是告诉编译器说,哎我现在是什么类型,我还没有决定哦,所以你要在上面的第一行class,上面第一行,用这个黄色这一行来告诉编译器说 T 是什么呢,tapename 它是一个 type 未定,那将来怎么用呢,下面就是用法,使用者终于决定要把这个实部虚部绑定指定,为什么类型,像第一行就是说我要这个复数,并且我指定里面是double这样,终于这个t就被绑定为double,如果是下面这里呢,好等一下啊,这个屏幕我看看好,如果是第二行呢,那就是说我还是要用这一份代码,但是我要把这个t绑定为指定,指名为整数,这个就是模板的概念。像我们在日常生活中的一个模子,机械一个模子,那你可以用这个模子翻模,翻模,做出很多在机械它会做出一模一样的东西了,但是在这个在我们这个语言里面呢,它会做出来99%像,99.9像的东西,只是把这个t替换掉而已,模板的衍生出去的话题以及语法呢很多好,我们现在只是给各位一个这样的观念,而我后面的例子也不会去用模板,所以我们还是要回到上一页,就是啊传统的那个形式好。
总结
C vs. C++, 关于数据与函数
- C 语言缺点:由于 C 语言没有提供足够的关键字,所以 数据一定是全局的,因此 各个函数都可以去处理这些数据。
- 解决:面向对象的语言
- C++ 是第一个最有名的面向对象语言。以这个为类型
- 解决方法:把数据和处理这些数据的函数包在一起叫做 class, 以这个 class 为类型去创建 很多的对象。
class 经典分类
- 不带指针,如 复数
- 带指针, 如 字符串
数据可能有很多份,但是函数只有一份。
字符串 特色是在于它里头其实只有一根指针,每个字符串对象里面都只有一根指针。
New
创建一个对象。
基于对象和面向对象
Object Based : 面对的是单一 class 的设计
Object Oriented : 面对的是多重 classes 的设计,classes 和 classes 之间的关系。
C++ programs 代码基本形式
延伸文件名 (extension file name) 不一定是 .h 或 .cpp,也可能是 .hpp 或其它或甚至无延伸名。
主程序用 include 的方式去使用头文件:
- include 标准库用 < >
- include 自己写的用 " "
Output, C++ vs. C
C 语言
- #include <cstdio>
- printf:要输出什么东西,得说清楚
C++:
- #include <iostream>
- cout <<: 输出什么都行
Header (头文件) 中的防卫式声明
#ifndef __COMPLEX__
#define __COMPLEX__
...
#endif
写的任何一个头文件,都要加上这一个防卫式的声明,防止重复包含。
Header (头文件) 的布局
class 的声明 (declaration)
- class head
- 大括号
- class body
- data
- 函数, friend
class template (模板)
只是 数据类型不同,可以使用 类模板
template<typename T>
class complex
{
...
};
标签:这个,头文件,我们,说明,复数,include,class
From: https://www.cnblogs.com/odesey/p/17454027.html