01. 初识C++
一、C++概述
C++ 可以看作是 C 语言的增强版,在 C 的基础上扩展了更多的功能。最主要的扩展,就是面向对象和泛型编程。因此 C++ 融合了不同的编程方式:以 C 语言为代表的面向过程编程;面向对象编程;以及模板化的泛型编程。
在 C 语言中,其理念是将大型程序分解成小型、便于管理的任务。如果其中的一项任务仍然过大,则将它分解为更小的任务。这一过程一直持续下去,直到将程序划分为小型的、易于编写的模块。
虽然结构化编程的理念提高了程序的清晰度、可靠性,并使之便于维护,但它在编写大型程序时,仍然面临挑战。为了应对这种挑战,OOP 提供了一种新的方法。与强调算法过程性编程不同的是,OOP 强调的是数据。
在 C++ 中,类是一种规范,它描述了这种新型数据格式,对象是根据这种规范构造的特定数据结构。OOP 程序设计方法首先设计类,它们准确地表示了处理的东西。OOP 编程不仅仅是将数据和方法合并为类定义,它还可以隐藏数据,使其免遭不恰当的访问。多态让你能够为运算符和函数创建多个定义,通过编程上下文来确定使用哪个定义。继承让你能够使用旧类派生出新类。
泛型编程是 C++ 支持的编程模式。它与 OOP 的目标类似,即使重用代码和抽象通用概念的技术更加单。不过 OOP 强调的是编程的数据方面,而泛型编程强调的是独立于特定数据类型。OOP 是一个管理大型项目的工具,而泛型编程提供了常见任务。泛型需要对语言进行扩展,以便可以只编写一个泛型(即不是特定类型的)函数,并将其用于各种实际类型。
二、简单上手
C++ 的开发环境有多种,我们可以使用微软开发的 Visual Studio 来开发 C++ 语言程序,也可以采用 gcc + 文本编辑器 的方式来开发 C++ 程序。这里使用 VSCode + MinGW 开发。
安装和配置的步骤请点击链接查看:https://www.cnblogs.com/kurome/p/17115943.html
#include <iostream>
int main(void)
{
/* 一个简单的C++程序 */
// 向控制台输出Hello World!
std::cout << "Hello World!" << std::endl;
return 0;
}
#include <iostream>
这是一条预处理指令,告诉编译器引入 instream 库。该编译指令会导致预处理器将 iostream 文件的内容添加到程序总。#include
编译指令导致 iostream 文件的内容随源代码的内容一起被发送给编译器,将源代码文件和 iostream 组合成一个复合文件。
像 iostream 这样的文件叫作 包含文件,由于它们被包含在其它文件中,因此,它们也被称为 头文件。C 语言的传统是头文件使用.h 作为文件扩展名,但是在 C++ 中,对老式的 C 的头文件保留了扩展名 .h,而 C++ 头文件则没有扩展名。有些 C 头文件被转换成 C++ 头文件时,这些文件会被重命名,去掉了 .h 扩展名,并且在文件名前面加上前缀 c(表明来自 C 语言)。
int main(void)
C++ 程序 中可以包含一个或多个 函数 。上述程序中有一个名为 main() 的函数。圆括号表示 main() 是一个函数名。int 表示 main() 函数返回一个整数。void 表示 main() 不带任何参数。main() 函数是 C++ 程序的入口函数。
/* 一个简单的C++程序 */
// 向控制台输出Hello World!
多行注释在 /* 和 */ 两个符号之间,单行注释在 // 之后,这些注释能提高程序的可读性。注释只是为了帮助读者理解程序,并不会参与程序的编译和运行,编译器会忽略它们。
左花括号 {
表示 函数定义开始 , 右花括号 }
表示 函数定义结束 。
std::cout << "Hello World!" << std::endl;
其中,std::cout
是标准的输出流对象。 <<
是做 标准输出的运算符,左边 必须是一个 输出流的对象。cout 的对象属性包含一个插入运算符(<<),它可以将其右侧的信息插入到流中。std::out << "Hello World!"
执行完之后,得到的还是一个输出流对象。因此,还可以使用输出运算符继续输出。后面的 std::endl
表示这行的结束,相当于换行。
其中,std
是命名空间,我们可以在程序的开头使用 using namespace
来使用命令空间。
#include <iostream>
using namespace std;
int main(void)
{
/* 一个简单的C++程序 */
// 向控制台输出Hello World!
cout << "Hello World!" << endl;
return 0;
}
return 0;
这里,我们使用 return 语句返回一个数,一般认为,返回 0 表示程序正常退出,返回其它数表示程序出错。
如果执行程序的时候一闪而过,我们可以在程序的后面 return 语句之前添加如下代码暂停控制台。
// 等待键盘输入
cin.get();
三、进一步使用C++
#include <iostream>
int main(void)
{
using namespace std;
int carrots;
cout << "How many carrots do you have?" <<endl;
cin >> carrots; // C++中的输入
cout << "Here are two more.";
carrots = carrots + 2;
cout << "Now you have " << carrots << " carrots. " << endl;
return 0;
}
int carrots;
该语言在程序中声明了一个变量。程序中的神功语句也叫定义声明语句。这意味着它将导致编译器为变量分配内存空间。
cin >> carrots; // C++中的输入
输出时, <<
运算符将字符串插入到输出流中。输入时,cin
使用 >>
运算符从输入流中抽取字符。通常,需要再运算符右侧提供一个变量,以接收抽取的信息(符号 << 和 >> 被选择用来指示信息流的方向)。
carrots = carrots + 2;
符号 = 叫作 赋值运算符,它可以把值赋值给存储单元。在 C++ 中,所有变量都必须先声明,后赋值,再使用。如果不对函数内部定义的变量进行初始化,该变量的值将是不确定的。这意味着该变量的值将是它被创建之前,相应内存保存的值。
将 using namespace std; 放在函数定义之前,让文件中所有的函数能够使用名称空间 std 中所有的元素。而将 using namespace std; 放在特定函数定义中,则只让该函数能够使用名称空间 std 中的所有元素。
四、多个函数
#include <stdio.h>
void butler(void);
int main(void)
{
printf("I will summon the butler function.\n");
butler();
printf("Yes. Bring me some tea and writeable DIVDS.\n");
return 0;
}
/* 函数定义开始 */
void butler(void)
{
printf("You rang, sir?\n");
}
butler() 函数出现了 3 次。第 1 次是 函数原型(prototype),告诉编译器在程序中要使用该函数。第 2 次以 函数调用(function call)的形式出现在 main() 函数中。最后一次出现在 函数定义(function definition)中,函数定义即是函数本身的源代码。
函数原型 是一种声明形式告诉编译器正在收用某函数,因此函数原型也被称为 函数声明(function declaration)。函数原型还指明了函数的属性。例如,butler() 函数原型中第 1 个 void 表明,butler() 函数没有返回值(通常,被调函数会向主函数返回一个值)。第 2 个 void 的意思是 butler() 函数不带参数。因此,编译器运行到此,会检查 bulter 是否使用得当。
在 main() 中调用 butler() 很简单,写出函数名和圆括号即可。当 butler() 执行完毕后,程序会继续执行 main() 中的下一条语句。
何时执行 butler() 函数取决于它在 main() 中被调用的位置,而不是 butler() 的定义在文件中的位置。例如,把 butler() 函数的定义放在 main() 定义之前,不会改变程序的执行顺序,butler() 函数仍在两次 printf() 调用之间被调用。无论 main() 函数在程序处于什么位置,所有的 C++ 程序都从 main() 开始执行。
C++ 能够使用 printf()、scanf() 和其它所有标准 C 输入和输出函数,只需要包含常规 C 语言的 stdio.h 头文件。