当前位置: 首页 > article >正文

c++--------c++概念

定义与起源

  • C++是一种高级编程语言,它是C语言的扩展。C++由Bjarne Stroustrup在20世纪80年代初开发,最初被称为“C with Classes”。其设计目的是在保持C语言高效性的同时,增加面向对象编程(OOP)的特性。例如,C语言主要侧重于过程式编程,像写一个简单的文件读取程序,在C语言中是通过一系列的函数调用来实现,如fopenfreadfclose等函数按顺序操作。而C++在C的基础上,允许将文件读取操作封装到一个类中,这样可以更好地组织和管理代码。

主要特性

  • 面向对象编程(OOP)
    • C++支持类和对象的概念。类是一种用户定义的数据类型,它封装了数据成员(变量)和成员函数(方法)。例如,定义一个简单的Circle类来表示圆:
    class Circle {
    public:
      double radius;
      double calculateArea() {
        return 3.14 * radius * radius;
      }
    };
    
    在这个例子中,radius是数据成员,calculateArea是成员函数。可以通过创建Circle类的对象来使用这些成员,如Circle myCircle; myCircle.radius = 2.0; double area = myCircle.calculateArea();
  • 继承
    • 继承允许创建一个新类(派生类),它继承了现有类(基类)的属性和行为。例如,定义一个ColoredCircle类继承自Circle类:
    class ColoredCircle : public Circle {
    public:
      std::string color;
    };
    
    这里ColoredCircle类继承了Circle类的radius成员和calculateArea函数,同时还添加了自己的color成员。
  • 多态
    • 多态是指同一种操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在C++中,通过虚函数来实现多态。例如,有一个基类Shape和两个派生类CircleRectangle,都有一个draw函数:
    class Shape {
    public:
      virtual void draw() {
        std::cout << "Drawing a shape" << std::endl;
      }
    };
    class Circle : public Shape {
    public:
      void draw() override {
        std::cout << "Drawing a circle" << std::endl;
      }
    };
    class Rectangle : public Shape {
    public:
      void draw() override {
        std::cout << "Drawing a rectangle" << std::endl;
      }
    };
    
    可以通过基类指针来调用派生类的函数,如Shape* shape1 = new Circle; shape1->draw(); // 输出Drawing a circle,根据对象的实际类型来决定调用哪个draw函数。
  • 模板(Templates)
    • 模板是C++的一个强大特性,它允许编写泛型代码。例如,定义一个简单的模板函数来交换两个变量的值:
    template<typename T>
    void swap(T& a, T& b) {
      T temp = a;
      a = b;
      b = temp;
    }
    
    这个函数可以用于交换不同类型的变量,如int num1 = 1, num2 = 2; swap(num1, num2);或者double d1 = 1.0, d2 = 2.0; swap(d1, d2);
  1. 应用领域
    • 系统软件
      • C++在操作系统、编译器等系统软件的开发中广泛应用。例如,Linux操作系统的部分代码就是用C++编写的。C++的高效性使得它能够很好地处理系统资源的管理和底层操作。
    • 游戏开发
      • 许多大型游戏的引擎都是用C++编写的。像Unreal Engine(虚幻引擎),它提供了高性能的图形渲染、物理模拟等功能。C++可以直接操作硬件,能够充分利用计算机的性能来实现复杂的游戏逻辑和逼真的视觉效果。
    • 数据库管理系统
      • C++用于开发高性能的数据库管理系统。例如,MySQL数据库的部分核心代码是C++编写的。C++能够高效地处理大量的数据存储、检索和管理任务。
  2. 与其他语言的比较
    • 与C语言比较
      • C++继承了C语言的语法和高效性。C语言主要是过程式编程,而C++在此基础上增加了面向对象编程等特性。例如,C语言中没有类的概念,在处理复杂的软件项目时,代码的组织和复用性相对较差,而C++可以通过类来更好地组织代码结构。
    • 与Java比较
      • Java是一种纯面向对象的编程语言,具有自动内存管理(垃圾回收)的特性。C++虽然也支持面向对象编程,但需要开发者手动管理内存(虽然也有智能指针等工具来辅助)。另外,C++的执行效率通常比Java高,因为Java有一层虚拟机的中间层,而C++编译后的代码直接在机器上运行。例如,对于一些对性能要求极高的实时系统,C++可能是更好的选择。

在这里插入图片描述

C++程序结构

  1. 头文件部分(#include)

    • 作用
      • 头文件包含是C++程序结构的重要部分。#include指令用于将其他头文件的内容引入到当前文件中。头文件中通常包含函数声明、类定义、常量定义和模板声明等内容,这使得程序可以复用已有的代码定义,避免重复编写相同的代码片段。
    • 示例
      • 标准库头文件:#include <iostream>是C++中最常用的头文件之一。它提供了输入输出流的功能,如std::cout用于标准输出(控制台输出),std::cin用于标准输入(控制台输入)。例如,在下面的代码中:
      #include <iostream>
      int main() {
        std::cout << "Hello, World!" << std::endl;
        return 0;
      }
      
      因为包含了<iostream>头文件,所以能够使用std::cout来输出字符串。
      • 用户自定义头文件:假设你有一个名为myfunctions.h的头文件,其中定义了一些函数声明,如int add(int a, int b);。在主程序文件(假设为main.cpp)中,你可以使用#include "myfunctions.h"来包含这些函数声明,这样在main.cpp中就可以调用add函数。
  2. 命名空间(namespace)使用

    • 作用
      • 命名空间用于将代码组织在不同的逻辑区域,主要目的是避免命名冲突。在大型项目或者使用多个库时,不同的部分可能会定义相同名称的函数、类或变量。命名空间就像一个容器,将相关的代码元素封装在一起,通过特定的语法来访问其中的内容。
    • 示例
      • 标准命名空间:在C++中,标准库中的大部分内容都位于std命名空间中。例如,std::coutstd::cin前面的std就是命名空间。你可以通过using namespace std;来避免每次都写std::前缀,但这种做法在大型项目中可能会导致命名冲突。更好的做法是只引入需要使用的部分,如using std::cout; using std::cin;或者在使用时完整地写上std::前缀。
      • 用户自定义命名空间:假设你定义了一个用户自定义命名空间MyNamespace,其中包含一个函数void myFunction()。定义如下:
      namespace MyNamespace {
        void myFunction() {
          // 函数体内容
        }
      }
      
      要使用这个函数,可以在main函数或者其他函数中通过MyNamespace::myFunction();来调用。
  3. 全局变量和全局函数声明与定义(如果有)

    • 作用
      • 全局变量是在所有函数和类外部定义的变量,其作用域是整个程序文件。全局函数是在全局范围内定义的函数,可在程序的任何地方调用(只要在声明或定义之后)。不过,过多地使用全局变量和函数可能会导致程序的可读性和可维护性变差,因为它们可以在程序的任何地方被修改。
    • 示例
      • 全局变量声明和定义:
      int globalVariable = 10;  // 全局变量定义,同时初始化
      extern int anotherGlobalVariable;  // 全局变量声明,假设在其他文件中定义
      
      • 全局函数声明和定义:
      int globalFunction(int a, int b) {  // 全局函数定义
        return a + b;
      }
      extern int anotherGlobalFunction(int a);  // 全局函数声明,假设在其他文件中定义
      
  4. 主函数(main) - 程序的入口点

    • 作用
      • main函数是C++程序的起点,程序从main函数的第一条语句开始执行。它有两种常见的形式:int main()int main(int argc, char* argv[])int main()是最简单的形式,函数返回一个int类型的值,通常用于表示程序的退出状态(0表示正常退出,非0表示异常退出)。int main(int argc, char* argv[])用于处理命令行参数,其中argc表示命令行参数的个数,argv是一个字符指针数组,argv[0]通常是程序的名称,argv[1]argv[argc - 1]是实际的命令行参数。
    • 示例
      • 简单的main函数:
      int main() {
        std::cout << "This is a simple C++ program." << std::endl;
        return 0;
      }
      
      • 带有命令行参数处理的main函数:
      int main(int argc, char* argv[]) {
        if (argc > 1) {
          std::cout << "Command - line arguments: ";
          for (int i = 1; i < argc; ++i) {
            std::cout << argv[i] << " ";
          }
          std::cout << std::endl;
        } else {
          std::cout << "No command - line arguments." << std::endl;
        }
        return 0;
      }
      
  5. 函数定义(包括成员函数和非成员函数)

    • 作用
      • 函数是一段完成特定任务的代码块。函数定义包括函数头(返回类型、函数名称和参数列表)和函数体(花括号内的代码)。函数可以接收参数,执行一系列操作,并返回一个结果(如果返回类型不是void)。在面向对象编程中,还有成员函数,它们是类的一部分,用于操作类的对象的数据成员。
    • 示例
      • 非成员函数定义:
      int add(int a, int b) {
        return a + b;
      }
      
      • 成员函数定义(假设存在一个类MyClass):
      class MyClass {
      public:
        int data;
        void setData(int value) {
          data = value;
        }
      };
      
  6. 类定义(如果是面向对象程序)

    • 作用
      • 类是一种用户定义的数据类型,用于封装数据成员(变量)和成员函数(方法)。类的定义包括类头(class关键字、类名称和可能的继承关系)和类体(花括号内的内容,包括数据成员和成员函数的声明)。通过类可以创建对象,对象是类的实例,它们具有自己的数据成员副本,并可以调用成员函数来操作这些数据。
    • 示例
      • 简单的类定义:
      class Rectangle {
      public:
        int width;
        int height;
        int area() {
          return width * height;
        }
      };
      
      • 带有构造函数和析构函数的类定义:
      class ComplexNumber {
      public:
        double real;
        double imaginary;
        ComplexNumber(double r = 0.0, double i = 0.0) : real(r), imaginary(i) {}  // 构造函数
        ~ComplexNumber() {}  // 析构函数
        double magnitude() {
          return std::sqrt(real * real + imaginary * imaginary);
        }
      };
      

在这里插入图片描述


http://www.kler.cn/a/448471.html

相关文章:

  • FFmpeg第二话:FFmpeg 主要结构体剖析
  • workman服务端开发模式-应用开发-gateway长链接端工作原理
  • 【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
  • 8位移位寄存器的verilog语言
  • 3354. 使数组元素等于零
  • macOS 配置 vscode 命令行启动
  • AI搜索之问题分解 智谱清言、Felo、360 AI搜索、mindsearch
  • ESP8266 WiFi模块入门:搭建网络与测试实践
  • 普通人不搞副业还有什么出路?难道都能选择躺平?
  • 记录仪方案_记录仪安卓主板定制_音视频记录仪PCBA定制开发
  • Ubuntu Netlink 套接字使用介绍
  • Linux之进程相关命令
  • 版本更新导致前端网站资源加载失败:Failed to fetch dynamically imported module
  • 设计模式の享元模板代理模式
  • Redis 基本命令操作指南
  • 解决Ubuntu下蓝牙耳机连接成功但无声音输出问题
  • 开源轮子 - EasyExcel01(核心api)
  • 高超声速技术对于无人机的推进!
  • FFmpeg第二话:FFmpeg 主要结构体剖析
  • 洛谷 P1886:滑动窗口 ← 单调队列(STL queue)
  • 【计算机网络课程设计】校园网规划与设计
  • 【原生js案例】让你的移动页面实现自定义的上拉加载和下拉刷新
  • 贪心算法在背包问题上的运用(Python)
  • mysql免安装版配置教程
  • 数据结构 (数组和矩阵,初级动态规划)
  • Ubuntu 环境安装 之 RabbitMQ 快速入手