c++的扩展名一般为cpp(cplusplus)。
通过这三步就可以编译C++文件了。
注意:1.每次如果修改了文件,都需要在g++文件名.cpp-otest来重新编译文件得到文件名.exe可执行文件,然后在执行即可。这时新的可执行文件就可以覆盖旧的可执行文件。
2.在notepad++中的设置->语言设置中将语言设置为C++
1面向过程的程序设计和面向对象的程序设计
面向对象程序设计与面向过程程序设计有着本质的区别。
面向过程程序设计是以功能为中心,数据和操作数据的函数(或过程)相分离,程序的基本构成单位是函数。
而面向对象程序设计是以数据为中心,数据和操作数据的函数被封装成一个对象,与外界向分隔,对象之间通过消息进行通信,使得各对象完成相应的操作,程序的基本构成单位是对象。
简单地说,面向过程的程序设计是以函数为基本构成单位;而面向对象的程序设计是以对象为基本构成单位。
2.为什么C++是面向对象的程序设计?面向过程的程序设计有什么不足呢?
基于以上面向过程的程序设计的不足,人们提出了面向对象的程序设计。
3.面向对象的编程思想
(1)客观世界中的事物都是对象(object),对象之间存在一定的关系。
(2)用对象的属性(attribute)描述事物的静态特征,用对象的操作(operation)描述事物的行为(动态特征)。
(3)把对象的属性和操作结为一体,形成一个相对独立、不可分的实体。对象对外屏蔽其内部细节,只留下少量接口,以便和外界联系。
(4)通过抽象对对象进行分类,把具有相同属性和相同操作的对象归为一类,类是这些对象的描述,每个对象是其所属类的一个实例。
(5)复杂的对象可以使用简单的对象作为其构成部分。
(6)通过在不成程度上运用抽象的原则,可以得到一般类和特殊类。特殊类可以继承一般类的属性和操作,从而简化系统的构造过程。
(7)对象之间通过传递消息进行通信,以实现对象之间的动态联系。
(8)通过关联表达类之间的静态关系。
4.面向对象的基本概念
1.对象
任何一个对象都具有两个基本要素:属性和行为。属性是用来描述对象的静态特征。行为是用来描述事物的动态特征。如一个人是一个对象,其身高、性别就可以看做属性,其可以走路、说话、打球就可以看做其行为。
且在对象之间一定要有联系,如电视这个对象被人这个对象按了一下开机按钮,电视这个对象就开机了,这就是对象与对象之间的联系。
总结:对象具有表示静态特征的属性和表示动态特征的行为,对象与对象之间需要传递信息来联系。
2.类
类是对客观世界中具有相同属性和行为的一组对象的抽象,它为属于该类的全部对象提供了统一的对象描述,其内容同样包括对象和属性。
那么什么是抽象呢?抽象就是指忽略事物的非本质特征,只注意那些和当前目标有关的本质特征,从而找出事物的共性。比如人就可以看做一个类,即人类,其中他是世界上所有实体人如张三、李四、王五的抽象。
总结:类是对象的抽象,而对象则是类的实例,或者说是类的具体表现形式。
3.封装
日常生活中的封装很多,如录像机,从外面来看他就是一个黑盒子,在他的表面有几个按键,而其内部的电路板和机械控制部件在外面是看不到的。
这样做的好处在于大大降低了人们操作对象的复杂程度,使用对象的人完全不需要知道对象内部的具体细节,只需要了解其外部功能即可自如地操作对象。
在面向对象方法中,所谓“封装”即包括两方面的含义:(1)用对象把属性和操纵这些属性的操作保证起来,形成一个基本单位,各个对象之间相互独立,互不干扰;(2)将对象中某些部分对外影藏,即影藏其内部细节,只留下少量的接口,以便于和外部联系,接受外界的消息。
4.继承
所谓继承是特殊类自动地拥有或者是隐含地复制其一般类的全部属性和操作。
集继承具有‘是一种’的含义,如卡车“是一种”汽车,“轿车”是一种汽车,二者作为特殊类继承了一般类--汽车类的所有的属性和操作。
我们也可以一个特殊类继承多个一般类,这就是多继承的概念。如继承了“销售”类和“经理”类就是“销售经理”。
C++提供的继承机制,就可以很方便的在一个已有的类的基础上建立一个新类,这就是常说的“软件重用”的思想。
5.消息
对象之间通过消息进行通信,实现了对象之间的动态联系。在C++中,消息就是函数调用。
6.关联
关联是两个多多个类之间的一种静态关系。如一个教室类可以管理一个学生类
7.组合
组合描述的类和类之间的整体和部分之间的关系。如汽车和发动机之间的关系就是组合。其实,组合是关联的一种。
8.多态性
如某个董事长出差,他把这个消息告诉了身边的人:妻子、司机、秘书。这些人听到之后会有不同的反应:他的妻子给他准备行李、秘书为他确认考察地安排住宿、司机会为他准备车辆。这就是多态。
1.C++是什么?
C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。
C++被认为是一种中级语言,它综合了高级语言和低级语言的特点。
C++是由BjarneStroustrup于1979年在新泽西州美利山贝尔实验室开始设计开发的。C++进一步扩充和完善了C语言,最初命名为带类的C,后来在1983年更名为C++。
C++是C的一个超集,事实上,任何合法的C程序都是合法的C++程序。
注意:使用静态类型的编程语言是在编译时执行类型检查,而不是在运行时执行类型检查。
2.基本结构
注意:我们也可以不适用usingnamespacestd;但是在程序中我们如果要使用cin和cout就必须在其前面添加std::如下所示:
最终会输出15
3.C++中的标识符
在C++中,可以使用字母、下划线作为首字母,而后可以跟字母、下划线和数字。注意:c++中是不支持$的,这点需要格外注意。且C++是区分大小写的。
4.和js一样,C++中也有一些保留字,我们再给变量命名的时候,是不能使用的。
5.C++中的数据类型有哪些?
上面是七种基本类型,每一种基本类型还可以使用一个多多个类型修饰符进行修饰。类型修饰符如下:
不同的类型所占的内存是不同的,我们可以使用sizeof()方法来输出,如下所示:
如上面的代码会得到4118,可以看出double所占的字节数是最多的。
6.typedef
C++中typedef的作用是将一个已有的类型的名称修改,def即定义的意思,如下所示:
typedefintzhu;zhuvari;
那么这时的vari就是整型变量。
inta;
boolb;
charc;
inta=15;
boolb=true;
charc="good";
inte=15,f=45;
注意:变量的初始化是一个好习惯,我们最好每次再定义变量的时候都要初始化;
看下面的例子:
最终会输出20。
我们再看一个函数调用的例子。
最终会输出20.
注意:
8.c++中的变量
如下:
最后输出的是10。
9.定义常量
在C++中,定义常量有两种方式,一种是使用#define常量名常量值显然使用这种方式常量值的类型是不确定的。还有一种可以确定常量值的类型的,就是使用const类型变量名=变量值;举例如下:
此代码最终就会输出10099。
10.C++存储类
最终输出15(int类型)和h(字符)
11.C++中的运算符
在C++中,和其他语言一样,都有自己的运算符,如+-/*等等,指的注意的是,判断是否相等,使用==即可,不像js中使用===的情况。
12.C++函数
什么是函数?函数就是很多语句组合在一起可以做某一件事情的东西。这就是函数。每个C++程序都至少有一个函数,即主函数main(),所有简单的程序都可以定义其他额外的函数。
另外:C++标准库还提供了大量的我们可以直接使用的内置函数,如strcat()用于拼接两个字符串等等。
和js的函数不同的是,C++的函数直接使用int即可,当然最后在函数内部你也要返回相应的int值,如return0;另外就是在传递参数的时候要使用int类似的类型确定其类型,举例如下:
13.函数参数
c++中的函数参数是形式参数,其和函数内的其他局部变量实际上是一样的。即在进入时被创建,执行结束被销毁。
如下所示:
即一般情况下我们使用的是传值调用,即这是把实际值复制给了函数的形式参数,所以,在这种情况下,修改函数内部的形式参数对实际值没有影响。
结果如下:
函数内部的a:100函数内部的b:40主函数的a:15主函数的b:20
可以看到:在函数内部修改了传进来的参数,只是修改了clone版本,并没有修改真正的a和b。这也就是传值调用。
在C++的函数中,我们也可以使用参数的默认值,即如果传入了该参数,那么就是用;如果没有传入,就是用默认值,如下所示:
14.C++中的数字运算
我们可以引入cmath库,然后使用C++自带的数字运算的函数,举例如下:
注意:这里必须引用cmath库,即#include
15.数组
intnumbers[10];
其中int也可以换成其他你需要的类型,如double等。在变量名后面的数字一定要大于0,这里为10表示这个数组中可以放下长度为10的数。
我们还可以初始化数组,只是这里初始化数组使用的是{},在数组的定义和初始化方面C++和js的差别较大。如下所示:
#include } 最终的输出结果:45,12,85,56 我们也可以不限制数组的长度:如intnumbers[]={45,12,85,56}; 16.C++字符串 在C++中,由于字符串的特殊性,一般情况下,我们是需要单独来将字符串的。在C++中有两种方式表示,一种是引入的C语言风格的,另一种是C++特有的。 charstr[]={'h','e','l','l','o','\0'}; 字符串实际上是使用null字符'\0'终止的一维字符数组。因此,一个以null结尾的字符串,包含了组成字符串的字符。可以看出,这里字符串的写法与数组非常相似。 还可以写成下面这种形式: charstr[]="hello"; 上面两种方式的字符串的效果是一样的。 最终的存储形式就是这样,最后一位是使用null占位表示结束。 在C++中,有大量的处理字符串的内置函数,如果希望使用这样函数,需要引入cstring(正如数学运算引入了cmath一样)举例如下所示: 最终输出:1010zhuzhenweihetingting 上面所说的都是C语言中字符串的实现,下面的是C++的。 C++标准库提供了string类类型,支持上述所有的操作,另外还增加了其他更多的功能。 看下面的例子: 值得注意的是:这里引入的是:#include 显然,cstring是c语言中的string,而string就是C++中类string,所以这里我们用到了链式调用,可以看出面向对象的C++使用起来多么方便,如果js也可以这样随便引入,就太好了。 17.C++指针 C++中比较有特色的当然就是指针了。这也是我复习C++的一个理由~看完这个就要睡觉啦~好困啊 哈哈,让我们先来看一看教程的说法: 学习C++的指针既简单又有趣。通过指针,可以简化一些C++编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的C++程序员,学习指针是很有必要的。 恩,加油吧,捡起来这一部分内容,先看看下面的代码: 这和之前的有什么区别的?恩,就是多了个&,这在C++中是用来取地址的,即你这个变量住在哪?(变量的内存地址)看看输出的结果: var1变量的地址:0x7fff9d7403ecvar2变量的地址:0x7fff9d7403f0 0X是指16进制的数字。 那么什么是指针呢? type*name; int*ip;/*一个整型的指针*/double*dp;/*一个double型的指针*/float*fp;/*一个浮点型的指针*/char*ch/*一个字符型的指针*/看看这个在C++中使用指针的例子: Valueofvarvariable:20Addressstoredinipvariable:0x7fff99a46294Valueof*ipvariable:20 18.C++引用 引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。 首先需要明白的是:引用不同于指针。 通俗的讲(个人理解),引用就是一个人的小名。看,比如指明了我这个大名: intzzw=8; 即8是我的身体,而zzw是代表我这个身体的大名。 但是我还可以起一个小名,如下: int&pig=zzw; 也就是说无论是大名zzw还是小名pig都指得是我自己,叫我什么我都答应。 实例如下: 最终的结果如下所示: 88对引用进行修改2020可以看到叫我小名我也答应你了(修改一个变量的引用,实际上就是修改它自己)。 19.C++数据结构 在C和C++的数组中可以定义存储相同数据类型的变量。但是在C++中还提供了数据结构,在这个数据结构里我们可以定义不同类型的变量。 具体应用举例如下: 另外,数据结构也可以作为参数传递进去,如下所示: 1.什么是函数重载? 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。 下面就是函数重在的例子,即实现一个打印函数: 最终的输出如下: printainteger:12printastring:helloworld!即我们调用函数名相同的函数(实现的功能也大抵相似)返回的值确实不同的。 2.为什么要函数重载? 补充: 静态数据成员介绍 今天刚刚使用MinGW和nodepad++来编译和执行文件了,和visualC++6.0是一样的可以cin也可以cout,还是非常激动的,趁此就多复习一些知识吧。 1.下面这是一个含有类和对象的最简单的例子: 其中classPerson用来定义一个名为Person的类,可以把类看做一个模子,然后我们用这个模子就可以创造形形色色的对象来了。值得注意的是,在class定义了之后,需要使用分号作为结束。 另外,使用public是说其中的内容是公有的,可以被调用的,而privite是私有的,只能在内部被调用。这就体现了著名的封装性的特点。 这就是面向对象,它引入了类和对象的概念,类是用户自定义的数据类型,对象是该数据类型的变量。 2.注意使用#define定义常变量时,只是将变量进行了简单的替换,如下所示: intx=1;inty=2;#defineRx+y#definePI3.1415926cout< 而如果我们使用constfloatPI=3.14;也是类似的作用,也可以写成floatconstPI=3.14;两者是等效的。 3、空指针和野指针 int*p=0;或者是int*p=NULL;那么这里的p就是空指针。 两者是不同的,引入空指针的目的是为了防止使用指针出错,如果出现了空指针就会报错,情况:动态分配内存malloc()函数或new运算符的成功使用不会返回空指针,但是失败了就会返回空指针。 如果定义了一个野指针,我们就不知道它到底会指向何处,为了避免不知指针指向了何处,在C++中一般习惯是定义了指针变量后立即初始化为空指针,然后在使用指针之前再给指针变量赋值,使指针有了具体指向之后再使用指针。 4.指针与const 5.void和void指针 不难想象,无论是什么类型的指针,它指向一个变量的首地址总是一样的,所以我们才可以使用void指针,但问题是:如果我们希望通过这个指针来访问他所指向的变量,就得知道这个变量的类型啊,因为不同类型的变量的内存大小是不一样的,所以得强制类型转化,告诉它这个变量的大小是多少,才可以读取。 如上,必须进行强制类型转换才能正确的输出p所指向的变量,注意:强制类型转换是(int*)因为这是一个指针。 6.使用new和delete动态管理内存单元 最终输出的是16323288,注意这是new到的一个内存,所以这是一个随机数。且new和delete必须要成对存在。我们还可以在new的时候初始化,即p=newint(20);那么*p就是20了。 那我们怎么申请连续空间的内存呢?方法也很简单,就是p=newint[20];这样就可以申请到长度为20的连续空间了。 7.引用,如int&a=b;这就是a对b的引用,可以看做a是b的另外一个名字,但是他们指向的同一个内存单元,所以对他们任意一个的修改都是有效的。下面我们看三个典型的例子,分别是值传递、指针传递和引用传递。 最后的结果都是x为5,y为10。这就是典型的值传递,即穿进去之后,内部的改变不会影响外面的。 最后的结果是:x:5,y:10后面是x:10,y:5可以发现这个交换就完成了。这就是典型的指针传递或地址传递。这样,在内部修改的*a和*b实际上就在修改x和y。 最后的结果是:x:5,y:10后面是x:10,y:5可以发现这个交换就完成了。这就是典型的引用传递,两者都是指向同样的内存,所以可以完成修改。 值得注意的是,在引用中,还是有const的,如constint&a=b;表示a这个引用是不能被修改的,即不能通过a来修改他和b共有的内存,即a的权利只是读。如下: 编译过程中就会提示b是只读的。 除此之外,我们还可以提供默认的参数,即如果没有传递该参数,我们就使用默认的。且默认的参数可以使其中的一个或几个(当然可以使全部),但是如果不是全部时,默认的参数需从最右边开始。 函数重载:即函数参数的类型不同或个数不同或函数参数的类型和个数都不相同。函数的返回值可以相同也可以不同,但是绝不能函数的参数形同而只有返回值不同,这不是函数的重载。如下: 一个输出的是13,另一个输出的是74。 9.详解名字空间 我之前所写的所有代码中都包括:usingnamespacestd;不难理解,这一定和命名空间是由关系的。下面我将从头说起。。。 (1)为什么要使用名字空间? 简单的说,使用名字空间是为了解决程序中名字冲突的问题,即在程序运行过程中遇到相同名字的变量,系统不能正确的区分它们。 在一个小型系统里,只要我们注意一下变量就不会重复,但是对于一个大型的系统,由多人合作完成,我们通过#include的方式来引入不同的开发人员所编写的程序,那就难免会遇到重名的情况,这样就导致类全局名字空间污染。 正是为了避免这样的问题,后来引入了名字空间的机制。(在早期的C++中,也是没有名字空间的概念的)。 (2)什么是名字空间? 所谓名字空间就是一个由程序设计者命名的内存区域。他可以根据需要建立一些有名字的命名空间域,把一些全局标识符分别放在不同的名字空间中,这样就可以解决变量冲突的问题了。就向一个文件下有一个目录,每个子目录又有一堆文件,那么各个目录下的文件是可以重名的,于是就解决了问题。 (3)如何使用名字空间? 语法如下: namespace名字空间名{定义成员} 其中成员的类型包括:常量、变量、函数、结构体、类、模板等,还可以是名字空间,即名字空间的嵌套。如下: 如果要访问名字空间ns中的成员,就可以采用“名字空间::成员名”的方法,如ns::RATE、ns::money、ns::tax()、ns2::count等等。 我们还可以给ns起一个别名,即namespaceanotherns=ns;那么就是anotherns::money就和ns::money的效果是一样的了。 技巧:使用using名字空间的成员名,如usingns::tax后面再访问tax()的时候就相当于ns::tax(),这样可以避免在每一次访问名字空间的成员时用名字空间限定,来简化名字空间的使用。 usingnamespace名字空间名; 注意2:如果同时使用usingnamespace引入了多个命名空间,那么要保证它们没有相同的变量名,否则还是会有命名冲突。 (4)标准名字空间std 即standard,标准的名字空间,系统预定义的头文件中的函数、类、对象和类模板都是在std中定义的。 所以,第二行都有一个usingnamespacestd;这就在全局中起作用了,如果不用的话,我们就要使用std::来访问了,如下所示: #include 如果引入了大量的系统的函数、类等,我们就需要添加没玩没了的std::,然后这是很不方便的。 9.字符串变量 我们知道在c中使用char来定义字符串和字符串数组都是十分麻烦的。而在c++中,由于有了类的概念,并且系统自带的就有string类,我们只要在开头引入即可,即#include 如stringstr="hello";这样就定义了一个字符串变量,我们可以对这个变量进行大量的操作,如strcat、strcopy等等。另外,还可以赋值,并且不需要考虑内存的问题。 和c中的最大的不同是,在c中的字符串,最后自动添加'\0'作为结尾,而string实例化的对象不需要使用'\0'作为结尾。且可以使用str[0]等来访问到每一个字符。 在c++中,还支持数组,如stringstr={"hello","world","hhahha"};即我们不需要考虑每一个元素的长度是否一致等。就是这个方便。