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);
        }
      };
      

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/940814.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面向对象设计过程的理解和实践

在软件开发的世界里&#xff0c;面向对象设计&#xff08;Object-Oriented Design&#xff0c;简称OOD&#xff09;是一项至关重要的技术。它不仅帮助我们更好地将现实世界的问题转化为软件系统中的对象&#xff0c;还确保这些对象之间能够高效地协同工作&#xff0c;共同实现系…

游泳溺水识别数据集,对9984张原始图片进行YOLO,COCO JSON, VOC XML 格式的标注,平均识别率在91.7%以上

游泳溺水识别数据集&#xff1a; 对9984张原始图片进行YOLO&#xff0c;COCO JSON, VOC XML 格式的标注&#xff0c;平均识别率在91.7&#xff05;以上 &#xff0c;可识别泳池或者水库中是否有人溺水。 数据集分割 训练组98&#xff05; 9818图片 有效集&#xff05;…

Llama3.370B超越GPT-4o和Claude3.5 Sonnet

AI领域日新月异&#xff0c;最近AI 领域发生了太多事情&#xff0c;本文就语言大模型Llama 3.3 70B、GPT-4o 和 Claude 3.5 Sonnet进行对比。 12月7日&#xff0c;Meta今年的最终AI模型将要来了。Meta12月6日发布了Llama 3.3&#xff0c;拥有700亿个参数&#xff0c;但其性能与…

linux内核网络分层概述

在开发应用时&#xff0c;我们使用 socket 实现网络数据的收发。以tcp为例&#xff0c;server端通过 socket, bind, listen来创建服务端&#xff0c;然后通过 accept接收客户端连接&#xff1b;客户端通过 socket和 connect系统调用来创建客户端。用于数据收发的系统调用包括 s…

【全栈实战】基于 Vue3 + Wot Design Uni 动手封装组件

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f60a;好久没有更新有关前端实战教程了&#xff0c;本文主要讲解【全栈实战】基于 Vue3 Wot Design Uni 动手封装组件&#xff01; &#x1f60a;这个教程你将会学到技术正确的选型、…

Ajax中的axios

既然提到Ajax&#xff0c;那就先来说一说什么是Ajax吧 关于Ajax Ajax的定义 Asynchronous JavaScript And XML&#xff1a;异步的JavaScript和XML。 反正就是一句话总结&#xff1a; 使用XML HttpRequest 对象与服务器进行通讯。 AJAX 是一种在无需重新加载整个网页的情况下&…

60.基于SSM的个人网站的设计与实现(项目 + 论文)

项目介绍 本站是一个B/S模式系统&#xff0c;个人网站是在MySQL中建立数据表保存信息&#xff0c;运用SSMVue框架和Java语言编写。并按照软件设计开发流程进行设计实现充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SSM的网…

聊聊Flink:Flink的状态管理

一、Flink的状态是什么&#xff1f; 我们知道&#xff0c;Flink的一个算子可能会有多个子任务&#xff0c;每个子任务可能分布在不同的实例&#xff08;即slot&#xff09;上&#xff0c;我们可以把Flink的状态理解为某个算子的子任务在其当前实例上的一个变量&#xff0c;该变…

Idea 将多个module显示在同一个project

Idea 将多个maven项目显示在同一个project下 1、选择菜单 File-》New -》Module from Existing Sources -> 2、在弹出的界面选中对应的Module的pom.xml,然后点击OK按钮就行了 (弹出框上面也提示了Eclipse 项目选中.project文件&#xff1b;Maven 项目选中pom.xml; ) 最终显…

文件解析漏洞中间件(iis和Apache)

IIS解析漏洞 IIS6.X #环境 Windows Server 2003 在iis6.x中&#xff0c;.asp文件夹中的任意文件都会被当做asp文件去执行 在默认网站里创建一个a.asp文件夹并创建一个1.jpg写进我们的asp代码 <%now()%> #asp一句话 <%eval request("h")%> 单独创建一…

gitee别人仓库再上传自己仓库

一、新建一个自己的Git仓库 如果没有注册账号的朋友&#xff0c;可以先去注册一个Gitee的账号&#xff0c;用于管理自己的代码特别好用&#xff01;&#xff01;&#xff01; 接下来就是在gitee上新建一个自己的仓库&#xff0c;如下图所示 二、右建 Git Bush Here删除.git文件…

STM32F407 | Embedded IDE01 - vscode搭建Embedded IDE开发环境(支持JLINK、STLINK、DAPLINK)

导言 Embedded IDE官网:https://em-ide.com/docs/intro 我猜肯定有部分人使用SI Keil开发STM32项目&#xff0c;也有vscode Keil开发STM32程序。SI或vscode编写代码&#xff0c;然后切换Keil编译、下载、调试程序。有一段时间&#xff0c;我也是这么干的。但是&#xff0c;程…

算法的学习笔记—扑克牌顺子(牛客JZ61)

&#x1f600;前言 扑克牌顺子问题是一道趣味性与逻辑性兼备的题目&#xff0c;要求判断五张牌是否能组成顺子&#xff0c;其中大小王&#xff08;癞子&#xff09;可作为任意牌面。癞子的特殊性增加了问题的复杂度&#xff0c;也为解题提供了更多的可能性。通过这一问题&#…

记录遇到的一个新的变种JS加密

源 逻辑分析 混淆代码的目的是隐藏实际逻辑&#xff0c;增加逆向工程的难度。以下是对代码的逐步分析和解读。 第一部分&#xff1a;立即调用的函数表达式 (IIFE) (function () {var _K [...]; // 存储大量字符串的数组 })();​ 1. 目的&#xff1a;这个 IIFE 是整个代码运行…

LeetCode:104.二叉树的最大深度

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;104.二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节…

Fastjson <= 1.2.47 反序列化漏洞复现

0x01 前言 Fastjson 是一个 Java 语言编写的高性能功能完善的 JSON 库&#xff0c;可以将 Java 对象转换为 JSON 格式&#xff0c;也可以将 JSON 字符串转换为 Java 对象&#xff0c;在中国和美国使用较为广泛。 0x02 漏洞成因 Fastjson < 1.2.68 版本在处理反序列化对象时…

python:函数

一、嵌套函数 1.1概念 嵌套函数是定义在另一个函数作用域内部的函数。外部函数可以访问其内部声明的嵌套函数&#xff0c;而嵌套函数则可以访问其外部函数的作用域&#xff08;包括参数和局部变量&#xff09;。 1.2实例 一般情况下&#xff0c;我们是这样书写嵌套函数的&a…

Linux 下的 GPT 和 MBR 分区表详解

文章目录 Linux 下的 GPT 和 MBR 分区表详解一、分区表的作用二、MBR&#xff08;Master Boot Record&#xff09;1. **特点**2. **优点**3. **缺点**4. **适用场景** 三、GPT&#xff08;GUID Partition Table&#xff09;1. **特点**2. **优点**3. **缺点**4. **适用场景** 四…

基于单片机的智能婴儿床监护系统多功能婴儿床摇篮系统

功能介绍 以STM32单片机为控制核心蓝牙传输控制可以进行哭闹检测、尿床检测、音乐播放、语音提醒、哭闹时可以进行摇床有不同的模式自动模式和睡眠模式 实物可做&#xff0c;其他功能也可以 电路图 PCB 源代码 u8 Temperature_High; //室内温度高阈值 u8 Temperature_…

人工智能在VR展览中扮演什么角色?

人工智能&#xff08;AI&#xff09;在VR展览中扮演着多重关键角色&#xff0c;这些角色不仅增强了用户体验&#xff0c;还为展览的组织者提供了强大的工具。 接下来&#xff0c;由专业从事VR展览制作的圆桌3D云展厅平台为大家介绍AI在VR展览中的一些主要作用&#xff1a; 个性…