C++入门 一

C++是什么?

C++语言是一种通用的,区分大小写的自由格式编程语言,支持面向对象,过程和通用编程。C++是一种中级语言,因为它包含高级语言和低级语言特性。

面向对象编程(OOP)

C++支持面向对象编程,C++中使用的面向对象编程的四个主要支持是:

  • 继承
  • 多态性
  • 封装
  • 抽象

C++的标准库

标准C++编程分为三个重要部分:

  • 核心库包括数据类型,变量和文字等。
  • 标准库包括操作字符串,文件等的一组函数。
  • 标准模板库(STL)包括操纵数据结构的一组方法。

C++的使用

使用C++编程语言,我们可以开发不同类型的安全和健壮的应用程序:

窗口应用程序

  • 列表内容
  • 客户端服务器应用程序
  • 设备驱动程序
  • 嵌入式固件等

C语言与C++的区别

有关C语言与C++的区别,请参考下表 -

序号 C语言 C++语言
1 C语言遵循程序性风格编程。 C++是多范式。 它支持程序和面向对象。
2 C语言中的数据的安全性较低。 在C++中,您可以对类成员使用修饰符,以使其对外部用户不可访问。
3 C语言遵循自上而下的方法。 C++遵循自下而上的方法。
4 C语言不支持函数重载。 C++支持函数重载。
5 在C语言中,不能在结构中使用函数。 在C++中,可以在结构中使用函数。
6 C语言不支持引用变量。 C++支持引用变量。
7 在C语言中,scanf()和printf()主要用于输入/输出。 C++主要使用流cin和cout来执行输入和输出操作。
8 在C语言中操作符不可能重载 在C++中操作符重载是可以的。
9 C语言程序分为程序和模块 C++程序分为函数和类。
10 C语言不提供命名空间的功能。 C++支持命名空间的特性。
11 在C语言中异常处理不容易。它必须使用其他函数执行。 C++使用Try和Catch块提供异常处理。

C++的特点(特性)

C++是面向对象的编程语言。 它提供了许多功能,如下所示。

  • 简单(Simple)
  • 机器独立或可移植(Portable)
  • 中级编程语言(Mid-level)
  • 结构化编程语言(Structured)
  • 丰富的程序库(Rich Library)
  • 内存管理(Memory Management)
  • 速度快(Fast Speed)
  • 指针(Pointers)
  • 递归(Recursion)
  • 可扩展(Extensible)
  • 面向对象(Object Oriented)
  • 基于编译器(Compiler based)

如下图所示 -

这里写图片描述

1. 简单

C++是一种简单的语言,它提供了结构化方法(将问题分解成几个小部分),丰富的库函数集,数据类型等。

2. 机器独立或移植

与汇编语言不同,C/C++语言程序可以在许多机器中执行,但可能有一点点或没有变化。但它不是平台无关的。

3. 中级编程语言

C++也用于做低级编程。 它用于开发系统应用程序,如内核,驱动程序等。它还支持高级语言的特性。 这就是为什么它被称为中级语言。

4. 结构化编程语言

C++是一种结构化编程语言,我们可以使用函数将程序分解为多个小部分。 所以,它很容易理解和修改。

5. 丰富程序库

C++提供了许多内置函数(程序库),一些常用的功能不用再去重头开始编写,有助于提高开发速度。

6. 内存管理

它支持动态内存分配的特性。 在C++语言中,可以通过调用free()函数随时释放分配的内存。

7. 运行速度快

C++语言的编译和执行时间都非常快。

8. 指针功能

C++提供指针的功能。 可以通过使用指针直接与内存交互。 我们可以使用内存,结构,函数,数组等指针。

9. 递归

在C++中,可以调用函数内的函数。 它为每个函数提供代码可重用性。

10. 可扩展

C++语言是可扩展的,因为它可以比较容易地采用新的功能。

11. 面向对象

C++是面向对象的编程(OOP)语言。 OOP使开发和维护变得更容易,因为在面向过程的编程语言中,如果代码随着项目规模的增长而增长,就不容易管理。

12. 基于编译器

C++是一种基于编译器的编程语言,意思是没有编译就没有C++程序可以执行。 首先,我们需要使用编译器编译程序,然后才能执行这个编译后的程序。

linux环境下编译C++ 程序

GCC(GNU Compiler Collection)是Linux下最主要的编译工具,GCC不仅功能非常强大,结构也异常灵活。它可以通过不同的前端模块来支持各种语言,如:Java、Fortran、Pascal、Modula-3和Ada。

安装Gcc和g++:

yum -y install gcc automake autoconf libtool make

安装g++:

yum install gcc gcc-c++

g++是GCC中的一个工具,专门来编译C++语言的。
GCC的参数有:( 也是分步实现)

  • -E 让GCC在预处理结束后停止编译。
g++ -E hello.cpp  -o  hello.i
  • -c 将hello.i编译成目标代码
g++  -c  hello.i  -o  hello.o
  • 将目标文件连接成可执行文件
g++ hell.o   -o   hello
  • 可以一步实现
g++  hello.cpp  -o  hello

假如有两个以上源文件应该一下编译

一步就实现:

g++   foo1.cpp   foo2.cpp   -o   foo

也可以分步实现:

g++   -c   foo1.cpp  -o   foo1.o
g++   -c    foo2.cpp  -o   foo2.o
g++   foo1.o  foo2.o    -o    foo

GCC一些常用选项

1、产生警告信息的选项大多数以-W开头 其中有-Wall

g++  -Wall  hello.cpp   -o   hello

2、将所有的警告当成错误的选项-Werror

g++ -Werror  hello.cpp  -o  hello

3、寻找头文件选项

-I (linux默认路径:头文件在/usr/include/下),不在这个路径下就要用-I指定。

gcc  foo.cpp  -I/home/include   -o  foo

4、 库依赖选项
-L (linux默认路径:库文件在/usr/lib/下),不在这个路径下就要用-L指定。

g++  foo.cpp  -L/home/lib  -lfoo  -o   foo

库就是将源文件编译之后生成的目标文件的集合。库命名以lib开头。库有静态库(通常以.a结尾)和动态库(通常以.so结尾)默认情况下,g++以动态库形式连接。如果要静态库连接则要用-static指定(g++ foo.cpp -L/home/lib -static -lfoo -o foo)

单个源文件生成可执行程序

下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: 单个源文件生成可执行程序。

/* helloworld.cpp */
#include <iostream>
int main(int argc,char *argv[])
{
    std::cout << "hello, world" << std::endl;
    return(0);
}

程序使用定义在头文件 iostream 中的 cout,向标准输出写入一个简单的字符串。该代码可用以下命令编译为可执行文件:

[root@localhost cpp]# g++ helloworld.cpp
[root@localhost cpp]# ll
total 16
-rwxr-xr-x. 1 root   root   9136 Mar  8 03:31 a.out
-rw-rw-r--. 1 yiibai yiibai  138 Mar  8 03:24 helloworld.cpp
[root@localhost cpp]#

编译器 g++ 通过检查命令行中指定的文件的后缀名可识别其为 C++ 源代码文件。
编译器默认的动作: 编译源代码文件生成对象文件(object file),链接对象文件和 libstd c++ 库中的函数得到可执行程序。然后删除对象文件。由于命令行中未指定可执行程序的文件名,编译器采用默认的a.out。程序可以这样来运行:

[yiibai@localhost cpp]$ ./a.out
hello, world
[yiibai@localhost cpp]$

更普遍的做法是通过 -o 选项指定可执行程序的文件名。下面的命令将产生名为 helloworld 的可执行文件:

[yiibai@localhost cpp]$  g++ helloworld.cpp -o helloworld
[yiibai@localhost cpp]$ ll
total 28
-rwxr-xr-x. 1 root   root   9136 Mar  8 03:31 a.out
-rwxrwxr-x. 1 yiibai yiibai 9136 Mar  8 03:32 helloworld
-rw-rw-r--. 1 yiibai yiibai  138 Mar  8 03:24 helloworld.cpp
[yiibai@localhost cpp]$

在命令行中输入程序名可使之运行:

[yiibai@localhost cpp]$  ./helloworld
hello, world
[yiibai@localhost cpp]$

程序 g++ 是将 gcc 默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。通过遵循源码的命名规范并指定对应库的名字,用 gcc 来编译链接 C++ 程序是可行的,如下例所示:

[yiibai@localhost cpp]$ gcc helloworld.cpp -lstdc++ -o helloworld

选项 -l (ell)通过添加前缀 lib 和后缀 .a 将跟随它的名字变换为库的名字libstdc++.a。而后它在标准库路径中查找该库。gcc 的编译过程和输出文件与 g++ 是完全相同的。

在大多数系统中,GCC 安装时会安装一名为 c++ 的程序。如果被安装,它和 g++ 是等同,如下例所示,用法也一致:

[yiibai@localhost cpp]$ c++ helloworld.cpp -o helloworld

多个源文件生成可执行程序

如果多于一个的源码文件在 g++ 命令中指定,它们都将被编译并被链接成一个单一的可执行文件。下面是一个名为 speak.h 的头文件;它包含一个仅含有一个函数的类的定义:

/* speak.h */
#include <iostream>
class Speak
{
    public:
        void sayHello(const char *);
};

下面列出的是文件 speak.cpp 的内容:包含 sayHello()函数的函数体:

/* speak.cpp */
#include "speak.h"
void Speak::sayHello(const char *str)
{
    std::cout << "Hello " << str << "\n";
}

文件hellospeak.cpp内是一个使用 Speak 类的程序:

/* hellospeak.cpp */
#include "speak.h"
int main(int argc,char *argv[])
{
    Speak speak;
    speak.sayHello("world");
    return(0);
}

下面这条命令将上述两个源码文件编译链接成一个单一的可执行程序:

$ g++ hellospeak.cpp speak.cpp -o hellospeak

提示: 这里说一下为什么在命令中没有提到“speak.h“文件(原因是:在“speak.cpp“中包含有”#include”speak.h““这句代码,它的意思是搜索系统头文件目录之前将先在当前目录中搜索文件“speak.h“。而”speak.h“正在该目录中,不用再在命令中指定了)。

源文件生成对象文件

选项 -c 用来告诉编译器编译源代码但不要执行链接,输出结果为对象文件。文件默认名与源码文件名相同,只是将其后缀变为.o。例如,下面的命令将编译源码文件 hellospeak.cpp并生成对象文件 hellospeak.o:

$ g++ -c hellospeak.cpp

命令 g++ 也能识别 .o 文件并将其作为输入文件传递给链接器。下列命令将编译源码文件为对象文件并将其链接成单一的可执行程序:

$ g++ -c hellospeak.cpp 
$ g++ -c speak.cpp 
$ g++ hellospeak.o speak.o -o hellospeak

选项 -o 不仅仅能用来命名可执行文件。它也用来命名编译器输出的其他文件。例如:除了中间的对象文件有不同的名字外,下列命令生将生成和上面完全相同的可执行文件:

$ g++ -c hellospeak.cpp -o hspk1.o 
$ g++ -c speak.cpp -o hspk2.o 
$ g++ hspk1.o hspk2.o -o hellospeak

编译预处理

选项 -E 使 g++ 将源代码用编译预处理器处理后不再执行其他动作。下面的命令预处理源码文件 helloworld.cpp 并将结果显示在标准输出中:

$ g++ -E helloworld.cpp

本文前面所列出的 helloworld.cpp 的源代码,仅仅有六行,而且该程序除了显示一行文字外什么都不做,但是,预处理后的版本将超过 1200 行。这主要是因为头文件 iostream 被包含进来,而且它又包含了其他的头文件,除此之外,还有若干个处理输入和输出的类的定义。
预处理过的文件的 GCC 后缀为.ii,它可以通过-o 选项来生成,例如:

$ gcc -E helloworld.cpp -o helloworld.ii

生成汇编代码

选项 -S指示编译器将程序编译成汇编语言,输出汇编语言代码而后结束。下面的命令将由 C++ 源码文件生成汇编语言文件 helloworld.s:

$ g++ -S helloworld.cpp

生成的汇编语言依赖于编译器的目标平台。

创建静态库

静态库是编译器生成的一系列对象文件的集合。链接一个程序时用库中的对象文件还是目录中的对象文件都是一样的。库中的成员包括普通函数,类定义,类的对象实例等等。静态库的另一个名字叫归档文件(archive),管理这种归档文件的工具叫 ar 。
在下面的例子中,我们先创建两个对象模块,然后用其生成静态库。
头文件 say.h包含函数 sayHello()的原型和类 Say 的定义:

/* say.h */
#include <iostream>
void sayhello(void);
class Say {
    private:
        char *string;
    public:
        Say(char *str)
        {
            string = str;
        }
        void sayThis(const char *str)
        {
            std::cout << str << " from a static library\n";
        }
        void sayString(void);
};

下面是文件say.cpp是我们要加入到静态库中的两个对象文件之一的源码。它包含 Say 类中 sayString()函数的定义体;类 Say 的一个实例 librarysay的声明也包含在内:

/* say.cpp */
#include "say.h"
void Say::sayString()
{
    std::cout << string << "\n";
}
Say librarysay("Library instance of Say");

源码文件 syshello.cpp 是我们要加入到静态库中的第二个对象文件的源码。它包含函数 sayhello() 的定义:

/* sayhello.cpp */
#include "say.h"
void sayhello()
{
    std::cout << "hello from a static library\n";
}

下面的命令序列将源码文件编译成对象文件,命令 ar 将其存进库中:

$ g++ -c sayhello.cpp
$ g++ -c say.cpp
$ ar -r libsay.a sayhello.o say.o

程序 ar 配合参数 -r 创建一个新库 libsay.a 并将命令行中列出的对象文件插入。采用这种方法,如果库不存在的话,参数 -r 将创建一个新的库,而如果库存在的话,将用新的模块替换原来的模块。
下面是主程序 saymain.cpp,它调用库 libsay.a 中的代码:

/* saymain.cpp */
#include "say.h"
int main(int argc,char *argv[])
{
    extern Say librarysay;
    Say localsay = Say("Local instance of Say");
    sayhello();
    librarysay.sayThis("howdy");
    librarysay.sayString();
    localsay.sayString();
    return(0);
}

该程序可以下面的命令来编译和链接:

$ g++ saymain.cpp libsay.a -o saymain

程序运行时,产生以下输出:

hello from a static library
howdy from a static library
Library instance of SayLocal instance of Say

猜你喜欢

转载自blog.csdn.net/weixin_38834998/article/details/80697166