C++快速入门

C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。

C++ 是 C 的一个超集,任何合法的 C 程序都是合法的 C++ 程序。该语言的特点是在静态编译期而不是动态的去编译

C++的面向对象特点

智完全支持面向对象的语言 具有封装,继承,多台,抽象。

C++的使用

基本上每个应用程序领域的程序员都有使用 C++。使用苹果电脑或 Windows PC 机的用户都在间接地使用 C++,因为这些系统的主要用户接口是使用 C++ 编写的。

C++ 本地环境设置

在C++ 编译器用于把源代码编译成最终的可执行程序。大多数的 C++ 编译器并不在乎源文件的扩展名,但是如果您未指定扩展名,则默认使用 .cpp,最常用的免费可用的编译器是 GNU 的 C/C++ 编译器。

安装 GNU 的 C/C++ 编译器

在win上安装:去下载MinGW 的主页 www.mingw.org,对应的版本的信息。在安装 MinGW 时,您至少要安装 gcc-core、gcc-g++、binutils 和 MinGW runtime,但是一般情况下都会安装更多其他的项。

将 bin 子目录到您的 PATH 环境变量中,这样就可以在命令行中通过简单的名称来指定这些工具。

使用 Visual Studio进行编译

下载对应的VS的IDE进行编译 一直下一步就好。

1:打开vs->File -> New -> Project

C++快速入门

C++快速入门

在main.cpp中编写程序  如:

C++快速入门

在运行编译  如:

C++快速入门

什么是g++

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

如:gcc main.cpp -lstdc++ -o main

C++基本语法

C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。如:对象,类,方法,及时变量

C++ 程序结构

C++快速入门

如上所示:

  • C++ 语言定义了一些头文件,这些头文件包含了程序中必需的或有用的信息。上面这段程序中,包含了头文件 <iostream>
  • 下一行 using namespace std; 告诉编译器使用 std 命名空间。命名空间是 C++ 中一个相对新的概念。
  • 下一行 // main() 是程序开始执行的地方 是一个单行注释。单行注释以 // 开头,在行末结束。
  • 下一行 int main() 是主函数,程序从这里开始执行。
  • 下一行 cout << "Hello World"; 会在屏幕上显示消息 "Hello World"。
  • 下一行 return 0; 终止 main( )函数,并向调用进程返回值 0。

C++ 注释

程序的注释是解释性语句,您可以在 C++ 代码中包含注释,这将提高源代码的可读性。所有的编程语言都允许某种形式的注释

C++ 支持单行注释和多行注释。注释中的所有字符会被 C++ 编译器忽略。

ps:C++可以在注释中嵌套注释

如:

C++快速入门

运行出现如下的提示 解决如:

C++快速入门

解决:

C++快速入门

C++快速入门

重新编译即可

C++ 数据类型

变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。如:存储各种数据类型(比如字符型、宽字符型、整型、浮点型、双浮点型、布尔型等)的信息

C++的基本内置类型:如下图C++快速入门

ps:wchar_t 实际上的空间是和 short int 一样。

由于语法基本和C的差不对 看下C++的面向对象这块

C++ 类 & 对象

C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。

类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。

C++ 类,对象,熟悉的定义和访问

类定义是以关键字 class 开头,后跟类的名称。 如下图:

C++快速入门

私有的成员和受保护的成员不能使用直接成员访问运算符 (.) 来直接访问。 这和java中差不多

C++ 类成员函数

类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。 如下示例

C++快速入门

#include <iostream>

using namespace std;

class Box
{
public:
    double length;         // 长度
    double breadth;        // 宽度
    double height;         // 高度

    // 成员函数声明
    double getVolume(void);
    void setLength(double len);
    void setBreadth(double bre);
    void setHeight(double hei);
};

// 成员函数定义
double Box::getVolume(void)
{
    return length * breadth * height;
}

void Box::setLength(double len)
{
    length = len;
}

void Box::setBreadth(double bre)
{
    breadth = bre;
}

void Box::setHeight(double hei)
{
    height = hei;
}

// 程序的主函数
int main()
{
    Box Box1;                // 声明 Box1,类型为 Box
    Box Box2;                // 声明 Box2,类型为 Box
    double volume = 0.0;     // 用于存储体积

    // box 1 详述
    Box1.setLength(6.0);
    Box1.setBreadth(7.0);
    Box1.setHeight(5.0);

    // box 2 详述
    Box2.setLength(12.0);
    Box2.setBreadth(13.0);
    Box2.setHeight(10.0);

    // box 1 的体积
    volume = Box1.getVolume();
    cout << "Box1 的体积:" << volume << endl;

    // box 2 的体积
    volume = Box2.getVolume();
    cout << "Box2 的体积:" << volume << endl;
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C++ 继承

已有的类称为基类,新建的类称为派生类。继承代表了 is a 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。

测试:

#include <iostream>

using namespace std;

// 基类
class Shape
{
public:
    void setWidth(int w)
    {
        width = w;
    }
    void setHeight(int h)
    {
        height = h;
    }
protected:
    int width;
    int height;
};

// 派生类
class Rectangle : public Shape
{
public:
    int getArea()
    {
        return (width * height);
    }
};

int main(void)
{
    Rectangle Rect;

    Rect.setWidth(5);
    Rect.setHeight(7);

    // 输出对象的面积
    cout << "Total area: " << Rect.getArea() << endl;

    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C++多继承

多继承即一个子类可以有多个父类,它继承了多个父类的特性,C++ 类可以从多个类继承成员。

语法:class A: public B, public C{}

C++ 中的函数重载

在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。

完全和java一楊C++快速入门

C++ 多态

多态:当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。

#include <iostream> 
using namespace std;

class Shape {
protected:
    int width, height;
public:
    Shape(int a = 0, int b = 0)
    {
        width = a;
        height = b;
    }
    int area()
    {
        cout << "Parent class area :" << endl;
        return 0;
    }
};
class Rectangle : public Shape {
public:
    Rectangle(int a = 0, int b = 0) :Shape(a, b) { }
    int area()
    {
        cout << "Rectangle class area :" << endl;
        return (width * height);
    }
};
class Triangle : public Shape {
public:
    Triangle(int a = 0, int b = 0) :Shape(a, b) { }
    int area()
    {
        cout << "Triangle class area :" << endl;
        return (width * height / 2);
    }
};
// 程序的主函数
int main()
{
    Shape* shape;
    Rectangle rec(10, 7);
    Triangle  tri(10, 5);

    // 存储矩形的地址
    shape = &rec;
    // 调用矩形的求面积函数 area
    shape->area();

    // 存储三角形的地址
    shape = &tri;
    // 调用三角形的求面积函数 area
    shape->area();

    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

結果沒有輸出

调用函数 area() 被编译器设置为基类中的版本,这就是所谓的静态多态,或静态链接 - 函数调用在程序执行前就准备好了。有时候这也被称为早绑定。

使用virtual來解決 对上述程序做修改

C++快速入门

问题解决:

编译器看的是指针的内容,而不是它的类型。因此,由于 tri 和 rec 类的对象的地址存储在 *shape 中,所以会调用各自的 area() 函数。

C++虚函数

在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。达到的目的就是根据调用的类型不通调用各自的方法,这种操作被称为动态链接,或后期绑定

对代码进行修改  如下图:

纯虚函数:

C++快速入门

= 0 告诉编译器,函数没有主体。

C++ 数据抽象

数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节。接口和实现分离的编程(设计)技术,C++ 类为数据抽象提供了可能。

如:cout输出文本

C++快速入门

cout 是如何在用户的屏幕上显示文本,他就是公共的额接口。

数据抽象的好处

  • 类的内部受到保护,不会因无意的用户级错误导致对象状态受损。
  • 类实现可能随着时间的推移而发生变化,以便应对不断变化的需求,或者应对那些要求不改变用户级代码的错误报告。

C++ 数据封装

如将类中的属性进行封装 属性需要进行私有化的数据

测试:

C++快速入门

公有成员 addNum 和 getTotal 是对外的接口,需要知道它们以便使用类。私有成员 total 是对外隐藏的。

C++ 接口(抽象类)

C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。

如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用 "= 0" 来指定的。

抽象类不能被用于实例化对象,它只能作为接口使用。必须实现每个虚函数,这也意味着 C++ 支持使用 目标类 声明接口。如果没有在派生类中重写纯虚函数,就尝试实例化该类的对象,会导致编译错误。

测试:

C++快速入门

一个抽象类是如何定义一个接口 getArea(),两个派生类是如何通过不同的计算面积的算法来实现这个相同的函数。

C++ 异常处理

异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况。

语法:

C++快速入门

try 块在不同的情境下会抛出不同的异常,这个时候可以尝试罗列多个 catch 语句,用于捕获不同类型的异常。

抛出异常

 throw 语句在代码块中的任何地方抛出异常。throw 语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出的异常的类型。

捕获异常

catch 块跟在 try 块后面,用于捕获异常。您可以指定想要捕捉的异常类型,这是由 catch 关键字后的括号内的异常声明决定的。

测试

C++快速入门

自定义新的异常

C++快速入门

what() 是异常类提供的一个公共方法,它已被所有子异常类重载。这将返回异常产生的原因。

C++ 命名空间

定義:

C++快速入门

using 指令

使用 using namespace 指令,就可以不用在前面加上命名空间的名称,这个指令会告诉编译器,后续的代码将使用指定的命名空间中的名称。

C++快速入门

輸出對飲的命名空間内容

嵌套的命名空间

命名空间可以嵌套  如下:

C++快速入门

C++ 模板

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。每个容器都有一个单一的定义,比如 向量.

函數模板

C++快速入门

C++ 预处理器

是一些指令,指示编译器在实际编译之前所需完成的预处理。所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。

C++ 还支持很多预处理指令,比如 #include、#define、#if、#else、#line 等,让我们一起看看这些重要指令。

#define 预处理

C++快速入门

参数宏

用 #define 来定义一个带有参数的宏  測試

C++快速入门

条件编译

有几个指令可以用来有选择地对部分程序源代码进行编译。这个过程被称为条件编译。C++快速入门

# 和 ## 运算符

# 和 ## 预处理运算符在 C++ ,# 运算符会把 replacement-text 令牌转换为用引号引起来的字符串。

測試:

C++快速入门

结果:

C++快速入门

解释:C++ 预处理器把下面这行:

cout << MKSTR(HELLO C++) << endl;转化成了
cout << "HELLO C++" << endl;

C++ 中的预定义宏

C++快速入门

测试:

C++快速入门

C++ 信号处理

可以通过按 Ctrl+C 产生中断,有些信号不能被程序捕获,但是下表所列信号可以在程序中捕获,并可以基于信号采取适当的动作

C++快速入门

如:

signal() 函数:

用来捕获突发事件。

语法:void (*signal (int sig, void (*func)(int)))(int);

函数接收两个参数:第一个参数是一个整数,代表了信号的编号;第二个参数是一个指向信号处理函数的指针。

更多函数查文档 

C++ Web 编程

谈到web开发,大家首先想到的PHP、JavaEE/JSP、.NET/ASP、Ruby on rails、Python的Django等等。可谓百花齐放,你一般不会想到C++和Web开发有什么关系,但其实动态网页的开发(web开发)可是在这些动态网页语言诞生之前就存在了的。所以C/C++也是可以做web开发的,它利用的技术是——CGI。

  • 公共网关接口(CGI),是一套标准,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的。
  • CGI 规范目前是由 NCSA 维护的,NCSA 定义 CGI 如下:

公共网关接口(CGI),是一种用于外部网关程序与信息服务器(如 HTTP 服务器)对接的接口标准。