首先,本次学习主要参考的书籍是C++Primer Plus第六版,为了方便今后参阅,故写下该学习笔记。
C++是在C语言基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言,是C语言的超集。 一、预备知识      
C++有三件法宝:1、继承了C语言高效、简洁、快速和可移植性的传统(C代表的过程性编程);2、面向对象的特性带来了全新的编程方法,这种方法是为了应付复杂程度不断提高的现代编程任务而设计的;3、C++的模板特性提供了另一种全新的编程方法—泛型编程。
      (1)C++简史    
20世纪70年代,C和Pascal语言引领人们进入结构化编程时代,其中C还能生成简单、快速运行的程序,并提供了处理硬件问题的能力,如管理通信端口和磁盘驱动器,使得C成为20世纪80年代占统治地位的编程语言,这段时间同时见证了OOP的发展。
      20世纪70年代早期,贝尔实验室的Dennis
Ritchie致力于开发UNIX操作系统(所谓操作系统是能够管理计算机资源、处理计算机与用户之间交互的一组程序),为了完成这项工作,Ritchie需要一种语言,不仅要生成简洁、快速的程序,并能有效地控制硬件。传统的方法是使用汇编语言,但这是一种低级语言,不仅直接操作硬件,而且依赖于计算机的内部机器语言,无法在不同的计算机平台工作,这就需要一种高级语言和编译器程序。因此C就是融合了这两种特性,不仅具有低级语言的效率、硬件访问能力,而且具有高级语言的通用性、可移植性。
       (2)C语言编程原理       
计算机语言要处理两个概念——数据和算法(程序)。数据是程序使用和处理的信息,算法是程序使用的方法。C语言刚出世的时候也是过程性的语言,这意味着它强调的是编程的算法方面。从概念上说,过程化编程首先要确定计算机应采取的操作,然后使用编程语言来实现操作。随着规模扩大,就会形成像“意大利面条式编程”这样的情况。
         因此引入结构化编程以及自顶向下的原则,即将大型的程序分解成小型,便于管理的任务。      (3)面向对象编程       
面向对象编程强调的是数据。OOP不像过程性编程那样,试图使问题满足语言的过程性方法,而是试图让语言满足问题的要求,其理念是设计与问题本质特性相对应的数据格式。
     
所以在C++中,类是一种规范,它描述了这种新型数据格式,对象是根据这种规范构造的特定数据结构。通常,类是规定了可使用哪些数据来表示对象以及可以对这些数据执行哪些操作。OOP程序设计方法首先设计类,它们准确表达了程序要处理的东西。然后可以设计一个使用这些类的对象的程序。这体现了一种自下而上的编程方法,即从低级组织(类)到高级组织(程序)的处理过程。因为OOP语言使得程序员可以轻松使用一些已有的类,所以C++真正的优点之一是:可以方便地重用和修改现有地、经过仔细测试的代码。
       (4)泛型编程         
泛型编程是C++支持的另一种编程模式,与OOP的目标相同,但是却使重用代码和抽象通用概念更简单。不过OOP强调的是编程的数据方面,而泛型编程强调的是独立于特定数据类型,它们的侧重点不同,OOP是一个管理大型项目的工具,而泛型编程提供了执行常见任务的工具,如对数据排序或合并链表。术语泛型指的是创建独立于类型的代码。例如,要对不同类型的数据进行排序,通常必须为每种类型创建一个排序函数,泛型编程需要对语言进行扩展,以便可以只编写一个泛型函数(即不是特定类型的),并将其用于各种实际类型。C++模板提供了完成这种任务的机制。
       (5)C++的起源       与C语言一样,C++也是在贝尔实验室诞生的,Bjarne
Stroustrup于20世纪80年代在这里开发出了这种语言。用他自己的话说,“C++主要是为了我的朋友和我不必再使用汇编语言、C语言或其他现代高级语言来编程而设计的。它的主要功能是可以方便地编写出好程序,让每个程序员更加快乐”。
      
称C++来自C语言中地递增运算符++,运算符将变量加1,名称C++表明,它是C的扩充版本,因为Stroustrup虽然在C上加入了OOP特性和对C的泛型编程支持,但是并没有对C的组件作很大的改动,因此C++是C语言的超集,这意味着任何有效的C程序都是有效的C++程序。C++程序可以使用已有的C软件库。其中OOP部分赋予了C++语言将问题所涉及的概念联系起来的能力,C部分则赋予了C++语言紧密联系硬件的能力,这种能力的结合成就了C++的广泛传播。
       在C++获得一定成功后,才添加的模板,这使得进行泛型编程成为可能。在模板特性被使用和改进后,然们才意识到它们和OOP一样重要。       
C++融合了OOP、泛型编程和传统的过程性方法,这表明C++强调的是实用价值,而不是意识形态方法。
二、C++学习的最基本知识
(1)进入C++         注意点:         1、C++对大小写敏感,其中编译器也是对拼写敏感的;       
2、文件扩展名cpp是一种表示C++程序的常用方法;       
3、C++输入输出函数为cin和cout函数,但也可使用printf()和scanf()函数,但要包含常规C语言的stdio.h文件;     
4、#include预处理编译指令、int main()作为接口的函数头、using namespace编译指令、结束mian函数的return函数;  
     5、C++中,语句结束后不能省略分号;       
6、如果编译器到达main()函数末尾时没有遇到返回函数,则认为main()函数以return 0结尾;        7、代码#include
<iostream>该编译指令导致预处理器将iostream文件的内容添加到程序中,这是典型的预处理器操作:在源代码被编译之前,替换或者添加文本;将
iostream文件的内容添加到程序中这一预处理器操作涉及程序与外部世界之间的通信。iostream中io指的是输入和输出。C++的输入/输出方案涉及
iostream文件中的多个定义。#include编译指令导致iostream文件的内容随着源代码文件的内容一起被发送给编译器。实际上,iostream
文件的内容将取代程序中的代码行#include<iostream>。原始文件没有被修改,而是将源代码文件和iostream
组合成一个复合文件,编译的下一个阶段将使用该文件。   
8、像iostream这样的文件叫做包含文件——由于它们被包含在其他文件中,也叫头文件——由于它们被包含在文件的起始处。C++编译器自带了很多头文件,每个头文件都支持一组特定的工具。C语言中头文件使用扩展名h,在C++中,对老式C的头文件保留了扩展名h,即C++也可以使用这种文件,但是C++风格的头文件是没有扩展名的,有些C头文件被转换时,会进行重命名,去掉扩展名h,并在文件名称前加上前缀c,如math.h->cmath。有时C头文件的C版本和C++版本相同,而有时新版本做了一些修改。对于纯粹的C++头文件来说,去掉h不只是形式上的改变,没有h的头文件也可以包含名称空间。
      9、如果使用iostream,而不是iostream.h,则应使用using namespace std的名称空间编译指令来使 iostream
中的定义对程序可用。名称空间支持是一项C++特性,旨在让你编写大型程序以及将多个厂商现有的代码组合起来的程序时更容易,它有助于组织程序。一个潜在的问题是,可能使用两个已封装好的产品,而它们都包含一个名为wanda()函数,这样,使用wanda()函数时,编译器将不知道指的是哪个版本,名称空间让厂商能够将其产品封装在一个叫做名称空间的单元中,这样就可以使用名称空间来指出想使用哪个厂商的产品。因此,Microflop
Industries可以将其定义放到一个名为Microflop的名称空间中,这样其wanda()函数的全称为Microflop::wanda();这样,程序就可以使用名称空间来区分不同的版本了。按这种方式,类、函数和变量便的是C++编译器的标准组件,它们现在都被放置在名称空间std中,这意味着在
iostream中定义的用于输出的cout变量实际上是std::cout,因此可以省略编译指令using。       10、对于cout<<"Come
up";语句来说,从概念上看,输出是一个流,即从程序流出的一系列字符。cout对象表示这种流,其属性是在iostream
文件中定义的。cout的对象属性包含一个插入运算符<<,它可以将其右侧的信息插入到流中。     
11、endl控制符,其重起一行的作用,和cout一样,endl也是在头文件中定义的,且位于名称空间std中。其中所谓的控制符是像endl一样对cout来说有特殊含义的特殊符号。C++中还提供了一种在输出中指示换行的旧方法,就是在“/n”,一般将其放在字符串的引号中,两者之间的区别在于,endl确保程序继续运行前刷新输出(将其立即显示在屏幕上),而使用“\n“不能提供这样的保证,这意味着在有些系统中,有时可能在你输入信息后才出现提示。
  12、源代码中的标记和空白。标记是指一行代码中不可分割的元素,空白则是空格、制表符和回车的统称。标记之间一般用空白来分开。   
13、声明不一定是定义,在C++中尽可能首次使用变量前声明它,这意味着将导致编译器为变量分配内存空间,而C中所有变量的声明通常都位于函数或过程的开始位置。
     14、对于类ostream和istream类,从技术上说,它们并没有被内置到C++语言中,而是语言标准指定的类,这些类的定义位于iostream
文件中,没有被内置到编译器中。    
 15、类描述了可对类对象执行的所有操作,要对特定对象执行这些允许的操作,需要给该对象发送一条信息。C++提供了两种发送消息的方法:一种是使用类方法;另一种方式是重新定义运算符,cin和cout采用的就是这种方式。
   
 16、例如x=sqrt(6.25),表达式sqrt(6.25)被称为函数调用,被调用的函数叫做被调用函数,包含函数调用的函数叫做调用函数。对于有返回值的函数来说,函数执行完毕后,语句中的函数调用部分将被替换为返回值。因此在使用函数之前,C++编译器必须知道函数的参数类型和返回值类型。如果缺少这些信息,编译器将不知道如何解释返回值。C++提供这种信息的方式就是使用函数原型语句。例如sqrt()的函数原型就像这样:double 
sqrt(double);函数原型之于函数就像变量声明至于变量——指出涉及的类型。原型结尾的分号表明它是一条语句,这使得它是一个函数原型,而不是函数头。如果省略分号,编译器将这行代码解释为一个函数头,并要求接着提供定义该函数的函数体。但不要混淆函数原型和函数定义,原型只描述函数接口,它描述的是发送给函数的信息和返回的信息,而定义中包含了函数的代码。C和C++将库函数的这两项特性分开了,库函数中包含了函数的编译代码,而头文件只包含了原型.

17、函数变体:有多个参数,如 double pow(double,double);不接受任何参数,如int rand(void);没有返回值,如void
bucks(double),这个函数是将数字以美元、美分的格式显示在屏幕上,由于这个函数把值发送给屏幕,而不是调用函数,因此不需要返回值,也不能将该函数调用放在赋值语句或其他表达式中。相反,应使用一条纯粹的函数调用语句:bucks(1234.56)。

18、对于main()函数来说,main函数是一个有返回值函数,所以需要使用关键字return来提供返回值,并结束函数,这就是为什么在main()函数结尾使用语句:return
0;的原因,但是这个返回值到底是返回到哪里了呢?事实上,可以将计算机操作系统看成是调用程序,因此main()函数的返回值并不是返回给程序的其他部分,而是返回给操作系统。

19、让程序访问名称空间std的方法有多种,下面是其中4种:(1)将using namespace
std;放在函数定义之前,让文件中所有函数都能使用名称空间std中所有元素;(2)将using namespace
std;放在特定的函数定义中,让该函数能够使用名称空间std中的所有元素;(3)在特定的函数中使用类似using
std::cout;这样的编译指令,而不是using namesapce
std;,让该函数能够使用指定的元素,如cout。(4)完全不使用编译指令using,而在需要使用名称空间std中的元素时,使用前缀std::,如下所示:std::cout<<"
    "<<std::endl。

三、总结

1、有多种类型的C++语句,包含下述6种:声明语句、赋值语句、消息语句:将消息发送给对象,激发某种行动。、函数调用、函数原型、返回语句。

2、C++提供了两个用于处理输入和输出的预定义对象(cin和cout),它们是istream和ostream类的实例,这两个类是在iostream文件中定义的。为ostream类定义的插入运算符(<<)使得将数据插入到输出流成为可能;为istream类定义的抽取运算符(>>)能够从输入流中抽取信息。cin和cout都是智能对象,能够根据程序上下文自动将信息从一种形式转换为另一种形式。

3、C++可以使用大量的C库函数,要使用库函数,应当包含提供该函数原型的头文件。

技术
今日推荐
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信