220223_C++_Primer_Plus_自学笔记_01&02_走进C++


220223_C++_Primer_Plus_自学笔记_0102_走进C++


目录
  • 220223_C++_Primer_Plus_自学笔记_0102_走进C++
    • C语言
      • 诞生背景
      • 编程原理
        • 面向过程(Procedure Oriented Programming, POP)
    • C++
      • 诞生背景
        • 面向对象(Object Oriented Programming, OOP)
        • 泛型编程
      • 可移植性
    • Hello World!
      • main()函数
      • 注释
      • C++预处理器和iostream文件
        • 头文件
        • 使用cout输出
      • 控制符endl、换行符\n
      • 声明变量
      • 赋值语句
      • 使用cin输入
    • 函数
      • 使用函数库中的函数
      • 自定义函数


C语言

诞生背景

20世纪70年代,贝尔实验室,Dennis Ritchie致力于开发Unix操作系统时需要一种简洁的、快速的、能控制硬件的语言。

以往通过汇编语言编写。汇编语言(Assembly Language)是面向机器的语言,是一种低级语言。
(机器语言→汇编语言→高级语言)

而Unix是致力于解决问题,而不针对某硬件,需要一种高级语言。因此,C语言应运而生。

编程原理

计算机语言处理的两个概念:

  • 数据:程序使用和处理的信息
  • 算法:程序使用的方法

面向过程(Procedure Oriented Programming, POP)

最初,C语言是过程性(procedural)语言,这意味着它强调的是编程的算法方面。
从概念上说,过程化编程首先要确定计算机应采取的操作,然后使用编程语言来实现这些操作。

随着程序规模的扩大,早期的程序语言(如FORTRAN和BASIC)都会遇到组织方面的问题。
很多旧式程序的执行路径很混乱(被称为“意大利面条式编程”)。
解决方法:① 结构化编程(Structured Programming);② 自顶向下(top-down)设计

C语言的设计有助于使用这种方法,它鼓励程序员开发程序单元(函数)来表示各个任务模块。
反映了过程性编程的思想,根据执行的操作来构思一个程序。


C++

诞生背景

20世纪80年代,贝尔实验室,Bjarne Stroustrup开发出了这种语言。

“C++主要是为了我的朋友和我不必再使用汇编语言、C语言或其他现代高级语言来编程而设计的。它的主要功能是可以更方便地编写出好程序,让每个程序员更加快乐”。

面向对象(Object Oriented Programming, OOP)

结构化编程的理念提高了程序的清晰度、可靠性,并使之便于维护,但它在编写大型程序时,仍面临着挑战。为应付这种挑战,OOP提供了一种新方法。与强调算法的过程性编程不同的是,OOP强调的是数据。

① 封装 :
引入了类(Class)的概念描述了这种新型数据格式,对象是根据这种规范构造的特定数据结构。
通常,类规定了可使用哪些数据来表示对象以及可以对这些数据执行哪些操作。

(例如,假设正在开发一个能够绘制矩形的计算机绘图程序,则可以定义一个描述矩形的类。定义的数据部分应包括顶点的位置、长和宽、4条边的颜色和样式、矩形内部的填充颜色和图案等;定义的操作部分可以包括移动、改变大小、旋转、改变颜色和图案、将矩形复制到另一个位置上等操作。这样,当使用该程序来绘制矩形时,它将根据类定义创建一个对象。该对象保存了描述矩形的所有数据值,因此可以使用类方法来修改该矩形。如果绘制两个矩形,程序将创建两个对象,每个矩形对应一个。)

OOP程序设计方法首先设计类,它们准确地表示了程序要处理的东西。
从低级组织(如类)到高级组织(如程序)的处理过程叫做自下向上(bottom-up)的编程。

② 继承:让旧类可以派生出新类。

③ 多态:为运算符和函数创建多个定义,通过编程上下文来确定使用哪个定义。

泛型编程

OOP是一个管理大型项目的工具,而泛型编程提供了执行常见任务的工具。
术语泛型(Generic)指的是创建独立于类型的代码

(例如,C++的数据表示有多种类型——整数、小数、字符、字符串、用户定义的、由多种类型组成的复合结构。例如,要对不同类型的数据进行排序,通常必须为每种类型创建一个排序函数。泛型编程需要对语言进行扩展,以便可以只编写一个泛型(即不是特定类型的)函数,并将其用于各种实际类型。)

可移植性

将一个程序,使用不同操作系统(Opeating System, OS)和处理器(Central Progressing Unit, CPU)计算机,能否良好运行?

可移植性方面存在两个障碍:① 硬件差异;② 语言差异。

为了缓解这些问题,一个国际标准ISO/IEC 14882:1998在1998年应运而生1998,并于1998年获得了ISO、IEC(International Electrotechnical Committee,国际电工技术委员会)和ANSI的批准。该标准常被称为C++98。C++在不断发展,更新版本。


Hello World!

#include                            // a PREPROCESSOR directive
int main()                                    // function header
{                                             // start of function body
    using namespace std;                      // make definitions visible
    cout << "Hello World!";  // message
    cout << endl;                             // start a new line
 
// If the output window closes before you can read it, add the following code:
    // cout << "Press any key to continue." <

//: 用于注释;
#include:预处理器编译指令
int main():函数头
using namespace:编译指令
{ ... }:函数体
cout:输出语句
return:结束函数

main()函数

int:函数返回类型。
():括号中应包含形式参数列表。
函数头描述的是main()与操作系统之间的接口。

  • int main(void)
    这里的void明确指出,函数不接受任何参数。与int main()等效。
  • void main( ) 与 省略返回语句的main() 在逻辑上一样。但是不标准,有些系统不能编译。
  • 当编译器没有返回语句,编译器默认返回语句 return 0。
  • 常规的编程中,C++程序必需拥有一个main()函数。

注释

C++的注释一般用 // 注释一行。
C风格的注释 /* xxxxxxx */,可以跨行注释。

C++预处理器和iostream文件

#include
using namespace std;

#include 将 iostream 文件内容添加到程序中。
这是一种典型的预处理器操作:在源代码被编译之前,替换或添加文本。
使用cin和cout进行输入和输出的程序必须包含文件iostream。

原始文件没有被修改,而是将源代码文件和iostream组合成一个复合文件,编译的下一阶段将使用该文件。

头文件

像iostream这样的文件叫做包含文件(include file)—由于它们被包含在其他文件中;也叫头文件(header file)。过去C语言以及C++最初,头文件有后缀.h,之后就没有了。iostream与iostream.h是完全不同的头文件。

对于iostream需要使用using namespace std才可以工作。
名称空间(namespace)是C++的新特性。大型项目中组合不同代码时,为了防止不同个体的代码中出现相同的函数名导致编译错误,从而名称空间就显得很重要。这里不做赘述。

如果不加入using namespace std,那么cout需要写成std::coutendl需要写成std::endl
直接使用using namespace std,让空间std中的所有名称都可用,这是偷懒的做法。
实际最好写成using std::coutusing std::endl等等。

使用cout输出

cout<<"stringxxxxxxxxxxxx" //字符串用双引号引起

cout是一个预定义的对象,知道如何显示字符串、数字和单个字符等。
这演示了对象的长处之一—不用了解对象的内部情况,就可以使用它。
只需要知道它的接口,即如何使用它。它将一个字符串插入到了输出流中。
cout可用于数字和字符串。

控制符endl、换行符\n

endl是一个特殊的C++符号,表示一个重要的概念:重起一行。
C++还提供了另一种在输出中指示换行的旧式方法:C语言符号\n,是一种转义字符。

声明变量

int a; // 数据类型 变量名;

赋值语句

a=1; // 变量名=数值;

使用cin输入

cin>>a;//cin>>变量名


函数

函数包含有返回值与没有返回值的函数。

默认的标准C++函数库中可以找到很多自带函数;当然也可以自己定义一些函数。

使用函数库中的函数

对于例子中的sqrt(),C++程序应当为程序中使用的每个函数提供原型,有两种方法:

  • 在源代码文件中输入函数原型;
  • #include 头文件cmath(老系统为math.h),其中定义了原型。

自定义函数

略,举例:

// ourfunc.cpp -- defining your own function
#include 
void simon(int);    // function prototype for simon()

int main()
{
    using namespace std;
    simon(3);       // call the simon() function
    cout << "Pick an integer: ";
    int count;
    cin >> count;
    simon(count);   // call it again
    cout << "Done!" << endl;
	// cin.get();
    // cin.get();
    return 0;
}

void simon(int n)   // define the simon() function
{
    using namespace std;

    cout << "Simon says touch your toes " << n << " times." << endl;
}                   // void functions don't need return statements

main( )返回一个int值,而程序员要求它 return 0,可将计算机操作系统(如UNIX或Windows)看作调用程序。因此,main( )的返回值并不是返回给程序的其他部分,而是返回给操作系统。
通常的约定是,退出值为0则意味着程序运行成功,为非零则意味着存在问题。