signed

QiShunwang

“诚信为本、客户至上”

C++学习之程序

2021/3/21 12:00:20   来源:

1、创建一个简单的C++程序helloworld.cpp

//Hello World --- test program //注释,编译器会忽略此处
#include <iostream>//预处理器编译指令#include
int main()//函数头
{//函数体
   using namespace std;//使用标准命名空间
   cout<<"Hello World"<<endl;//输出字符串
   return 0;//结束函数的return语句
}

使用g++ helloworld.cpp –o helloworld生成helloworld.exe,执行程序输出“Hello World

注意 :

     1)C++对大小写敏感,区分大写字符和小写字符

     2)所有语句都以分号结束,请不要省略分号

     3)C++中函数头int main()和int main(void)等效

    4)程序中必须要有main()函数,否则会编译失败,提示:undefined reference to 'WinMain@16',所以此函数大小写和拼写都要正确

    5)使用#include <xxx>编译指令,作用是预处理器将其后的文件xxx的内容添加到程序中,实际上xxx中的内容将取代程序代码行#include <xxx>,原始文件没有被修改,而是将 源代码文件和xxx组合生成一个复合文件,供编译的下一步使用。

   6)示例中iostream就是头文件,C++编译器自带很多头文件,每个头文件都支持一组特定的工具,头文件命名:

头文件类型

约定

说明

C++旧式风格

以.h结尾

C++程序可以使用,如:iostream.h

C旧式风格

以.h结尾

C/C++都可以使用,如:math.h

C++新式风格

没有扩展名

C++程序可以使用,如iostream

转换后的C

加上前缀C,没有扩展名

C++程序可以使用,可以使用不是C的特性,使用namespace std,如:cmath

 

   7)名称空间支持是一项C++特性,作用是在编写大型程序以及将多个厂商现有的代码组合起来的程序时更容易,有助于组织程序;using namespace xxx编译指令使得xxx名称空间中的所有名称都可用

   8)控制符endl:表示重启一行,在输出流中插入endl将导致屏幕光标移到下一行开头


2、声明/赋值变量

声明:int test;//编译器为变量分配内存空间,对于声明变量,尽可能在首次使用变量前声明它

赋值:test = 2021;//将2021赋给变量test表示的内存单元,= 是赋值运算符


3、类和对象

类是C++中OOP编程的核心概念之一,是用户定义的数据类型规范,类定义描述的数据格式及其用法,而对象则是根据数据格式规范创建的实体,如:类是描述的是所有的同事,而对象就好比其中一个同事。


4、函数

函数分两种:1、有返回值函数;2、无返回值函数

1)有返回值函数将生成一个值,而这个值可赋给变量或在其他表达式中使用。注意在使用函数之前,C++编译器必须知道函数的参数类型和返回类型,C++提供这种信息的方式是使用函数原型语句。

如:使用sqrt(),必须提供原型,可以用以下两种方式实现:   

* 在源代码文件中输入函数原型;

*包含有文件cmath,其中定义了原型。

注意:函数原型和函数定义是不一样的,原型只描述了函数接口,即描述的是发送给函数的信息和返回的信息;而定义中包含了函数的代码。原型一般定义在头文件中。

2)无返回值函数:原型中使用关键字void来指定返回类型,以指出函数没有返回值

void bucks();

3) 函数格式:

函数原型:type functionname(argumentlist);

函数:

type functionname(argumentlist)

{

    statements

}

4) 函数特性:有函数头和函数体;接受一个参数;返回一个值;需要一个原型


5、C++语句类型

  • 声明语句:定义函数中使用的变量的名称和类型

  • 赋值语句:使用赋值运算符(=)给变量赋值

  • 消息语句:将消息发送给对象,激发某种行动

  • 函数调用:执行函数。被调用函数执行完毕后,程序返回到函数调用语句后面的语句

  • 函数原型:声明函数的返回类型、函数接受的参数数量和类型

  • 返回语句:将一个值从被调用的函数那里返回到调用函数中


6、程序编译:

   编译过程:预编译,汇编,编译,链接。(本节以第1节代码编译为例)

  • 预编译:

处理#号开头的预处理命令,进行宏替换,去掉代码中的注释。

预编译命令:g++ -E helloworld.cpp -o helloworld.i

可以查看生成的helloworld.i文件去check预编译的处理结果。

  • 编译

编译器将.i文件编译成汇编文件

编译器对程序代码的编译主要分为下面几个过程:

1、词法分析;2、语法分析;3、语义分析;4、中间代码生成;5、代码优化;6、代码生成;7、符号表管理;8、将多个步骤组合成趟;9、编译器构造工具

编译命令: g++ -S helloworld.i ;

我们可以查看生成的helloworld.s去了解生成的汇编指令

  • 汇编

将汇编指令转变成机器可以执行的指令。

汇编命令: g++ -c helloworld.s -o helloworld.o

注意此处生成的.o文件是不能直接执行的,执行后会提示“无法执行二进制文件”

  • 链接程序

汇编生成的文件不能被执行,因为源文件中引用的内容需要被链接。链接器的主要功能就是将程序相关的所有目标文件链接在一起生成可执行文件

命令:g++ helloworld.o -o helloworld

我们执行生成的 ./helloworld.exe文件即会输出“Hello  World

注意:

链接主要分为两种:静态链接和动态链接

静态链接:直接把需要调用的库函数链接到目标程序,成为可执行文件的一部分。缺点是多个程序调用相同函数时,会存在多个拷贝动作,浪费内存资源

动态链接:所调用的库函数代码没有拷贝到可执行文件中,仅仅在执行文件中加入了调用函数所在文件模块(DLL)和调用函数在文件中的位置等信息,仅当程序运行时才会从DLL中寻找相应的函数。

相同点:都是共享代码的方式

对比:

动态链接库更加节省内存,在运行时链接,执行速度比静态链接稍慢。我们在维护或修改程序时,只要保证接口不变,直接替换DLL不会对程序造成影响。


小学生的学习之路