引言:无论是服务器开发、游戏、操作系统、虚拟现实等多是基于C++开发,而C++作为一门对象化编程语言,学习难度偏高。因此,决定写下这篇《C++进阶》,总结自己对C++的认识和总结。
学习书籍推荐:《C++ Primer Plus》、《C++ Primer》
1.基础知识
1.1 编译
程序编辑完成后,还需要进行编译。编译就是将高级程序设计语言编写的源程序,翻译成等价的机器语言(二进制语言)。完成编译的过程,需要使用工具:编译器。
目前常用的C/C++编译器:MSVC、GCC、Cygwin、MinGW。
MSVC是微软Windows平台Visual Studio自带的C/C++编译器;GCC(GNU Compiler Collection,GNU编译器套装)支持多种编译语言(C++、Fortran、Pascal、Objective-C、Java、Ada、Go等),是大多数类Unix(如Linux、BSD、Mac OS X等)的标准编译器(不支持windows),其支持多种计算机体系芯片,如x86、ARM架构。
注:Windows、linux等都属于平台或操作系统;x86、ARM、MIPS等都属于芯片的架构。
Cygwin是一个Windows下Unix-like模拟环境,其本质是Unix-like接口(命令行,OS API)重定向层;MinGW是一个在Linux/Windows下,可以把软件源码中Unix-like OS API调用通过头文件翻译替换成相应的Windows API调用的编译环境。Cygwin和MinGW都可以不修改软件源码仅重新编译就可以将Unix-like系统上的软件移植到Windows上。Cygwin和MinGW是编译环境而不是编译器,GCC是安装在Cygwin、MinGW上的编译器。
Cygwin和MinGW区别:Cygwin大,MinGW小;Cygwin编译后的exe需要cygwin1.dll作为支持,而MinGW不需要就可以直接运行,因为有中间层,所以Cygwin慢,MinGW快;Cygwin包含的内容更全面,能编译通过的linux源文件更多,MinGW的min是minimalist所以能编译通过的更少。
注:Unix-like系统下的软件,在windows下运行,需要进行移植。
集成开发环境(IDE)是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。C/C++开发软件(如Visual Studio 2017)中会提供这样的集成开发环境,可以管理程序开发的所有步骤。
1.windows编译器
在windows下的C++开发软件,最流行的是Visual Studio(目前已更新到2017版)。在Visual Studio 2017下创建项目:文件 -> 新建 -> 项目 -> Visual C++ -> Windows桌面 -> Windows桌面向导 -> 空项目 -> 源文件 -> 添加 -> 新建项 -> C++文件。代码编辑好后,点击“生成”就会编译出可执行文件;“开始执行”就会出现代码运行的结果。
2.linux
Linux系统中最常用的编译器就是GCC,在命令行中输入:
$ g++ -o hello_world hello_world.cpp
使用g++命令把hello_world.cpp,编译成可执行文件hello_world。再执行:
./hello_world
即可查看运行结果。
3.windows命令提示符
在windows命令提示符窗口,启动程序Cygwin或MinGW,它们将自动打开一个命令提示符窗口,可以使用g++命令编译hello_world.cpp文件,若编译成功,则可以得到.exe可执行文件。
我们通常所说的“编译”,其包含4个步骤:预处理、编译、汇编、链接。
1.预处理:
在C/C++源码中,以#开头的命令称为预处理命令,如宏定义#define、包含#include、条件编译#if和#ifdef等。预处理的作用就是将宏定义展开或根据条件编译指令选择使用的代码,最后将这些输入到一个文件中。
2.编译
将预处理后的文件,翻译成汇编文件。
3.汇编
将汇编文件翻译成一定格式的机器语言代码,即目标文件。
4.链接
将汇编产生的所有目标文件和系统的库文件链接在一起,生成在特定平台下的可执行文件。
1.2编程理念
1.过程化编程
C语言所遵循的旧的理念—过程化编程。计算机语言要处理的2个重要概念:数据、算法。过程化编程强调的是算法方面,即首先确定计算机应采取的操作,然后按照编程语言来实现这些操作,最后计算机按照一系列的流程来生成特定的结果。
2.对象化编程
C++语言遵循的理念—对象化编程(OOP)。对象化编程强调的是数据方面的操作,在程序设计中,首先设计类(新的数据类型),通过类来准确的表示程序要处理的东西。
3.泛型编程
泛型编程是C++支持的另一种编程思想,它独立于数据类型之外,强调代码的重用技术。其具体完成是通过C++模板来实现的。
1.3简单的hello_world
//hello_world.cpp
#include<iostream>
int main(void)
{
using namespace std;
cout << "hello world!" << endl;
}
运行结果:
hello world!
代码解释:
代码注释的方法:单行注释使用“//”;多行注释使用“/*...*/”。包含头文件iostream,用于输入输出。int main( )是函数头。std是名称空间(或命名空间)。
在C语言中,头文件的扩展名:.h,源文件扩展名:.c;C++中,头文件扩展名:.h、.hpp、.hxx,源文件扩展名:.cpp、.cc、.cxx。对于C++库中的头文件,在老式风格中,常采用.h、.hpp、.hxx等扩展名,但是在C++新式风格中,去掉了扩展名,因此iostream.h被转换成iostream。而在C语言库中的头文件,如math.h是C/C++都可以使用,转换成C++新式风格后,math.h转换为cmath,仅C++程序可用。
C++语言未定义任何的输入输出语句(可以使用C语言的printf、scantf等),而是使用标准库来提供IO机制。iostream库中包含两个类,即istream和ostream,分别表示输入流和输出流。cin是istream的对象,表示标准输入;cout是ostream的对象,表示标准输出,cerr也是ostream的对象,表示标准错误。cout<<是调用ostream类中<<运算符重载函数,cin>>同理。iostream头文件中使用<>表示从系统目录下开始搜索,然后再搜索PATH环境变量所列出的目录,不搜索当前目录;""是表示从当前目录开始搜索,然后是系统目录和PATH环境变量所列出的目录。
C++语法要求程序从main函数开始执行。通常,main( )函数被启动代码(或初始化代码)调用,这段启动代码由操作系统提供,由编译器在链接时加入可执行程序。操作系统载入程序后,执行这段启动代码,从这段代码中调用main函数。因此,我们完全可以将这段代码中程序入口修改为别的函数,这也是为什么windows应用程序的入口函数是WinMain的原因。
C++程序员给函数、类、变量命名时,有很多选择,为了统一以后的命名规范,采用my_function( )这样的形式来命名。