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.rhkb.cn/news/494024.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【优选算法---归并排序衍生题目】剑指offer51---数组中的逆序对、计算右侧小于当前元素的个数、翻转对

一、剑指offer51---数组中的逆序对 题目链接: LCR 170. 交易逆序对的总数 - 力扣&#xff08;LeetCode&#xff09; 题目介绍&#xff1a; 在数组中的两个数字&#xff0c;如果前面⼀个数字大于后面的数字&#xff0c;则这两个数字组成⼀个逆序对。输入一个数组&#xff0c…

C++算法第十二天

本篇文章&#xff0c;我们继续学习动态规划 第一题 题目链接 面试题 17.16. 按摩师 - 力扣&#xff08;LeetCode&#xff09; 题目解析 代码原理 代码编写 细节问题处理 这里的细节问题就是当n 0时的这种情况 完整源代码 class Solution { public: int massage(vector&…

java全栈day20--Web后端实战(Mybatis基础2)

一、Mybatis基础 1.1辅助配置 配置 SQL 提示。 默认在 mybatis 中编写 SQL 语句是不识别的。可以做如下配置&#xff1a; 现在就有sql提示了 新的问题 产生原因&#xff1a; Idea 和数据库没有建立连接&#xff0c;不识别表信息 解决方式&#xff1a;在 Idea 中配置 MySQL 数…

2023年厦门市第30届小学生C++信息学竞赛复赛上机操作题(三、2023C. 太空旅行(travel))

#include <bits/stdc.h>using namespace std;struct Ship {int u; // 从地球到火星的时间int v; // 从火星到天王星的时间 };// 自定义比较函数 bool cmp(const Ship &a, const Ship &b) {return a.u max(a.v, b.u) b.v < b.u max(b.v, a.u) a.v; }int ma…

使用qemu搭建armv7嵌入式开发环境

目录 目录 1 概述 2 环境准备 2.1 vexpress系列开发板介绍 2.2 安装工具 2.2.1 安装交叉工具链 2.2.2 安装qemu 2.2.3 安装其他工具 3 启动uboot 3.1 uboot下载与编译 3.1.1 下载 3.1.2 编译 3.2 使用qemu启动uboot 4 启动kernel 4.1 下载和编译kernel 4.1.1 下…

CSDN外链失效3:

参考我之前的博客&#xff1a; 外链失效博客1&#xff1a;随想笔记1&#xff1a;CSDN写博客经常崩溃&#xff0c;遇到外链图片转存失败怎么办_csdn外链图片转存失败-CSDN博客 外链失效博客2&#xff1a;网络随想2&#xff1a;转语雀_md格式转语雀lake格式-CSDN博客 markdown…

《LangChain大模型应用开发》书籍分享

前言 ChatGPT和OpenAI开发的GPT模型不仅改变了我们的写作和研究方式&#xff0c;还改变了我们处理信息的方式。《LangChain大模型应用开发》讨论了聊天模式下的LLM的运作、能力和局限性&#xff0c;包括ChatGPT和Gemini。书中通过一系列实际例子演示了如何使用LangChain框架构…

Jenkins持续集成部署——jenkins安装

前言 Jenkins 是一个开源的自动化服务器&#xff0c;主要用于持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;。它为软件开发团队提供了一个易于使用的平台来自动化构建、测试和部署应用程序的过程。 Jenkins 主要功能 1. 持续集成 (CI) 自动构建…

飞牛 fnos 使用docker部署 bili-sync:打造自动化 B 站资源下载器,与主流媒体服务器无缝衔接

Bili-Sync介绍及相关部署操作 一、Bili-Sync概述 Bili-Sync是哔哩哔哩内容同步助手&#xff0c;它能借助用户提供的登录信息&#xff0c;定期对用户的视频合集以及个人收藏进行遍历&#xff0c;找出还没在本地保存的新内容&#xff0c;然后自动下载到本地存储&#xff0c;以此…

Idean 处理一个项目引用另外一个项目jar 但jar版本低的问题

当在idea中一个module A引用另外一个项目B的jar&#xff0c;但是从私服仓库中拉下的jar版本比较低导致编译不通过时&#xff0c;可以把项目B拉下来&#xff0c;重新编译打包jar跟新到本地的仓库 选中右边菜单的Maven 选中对应的项目B-》Lifecycle->双击 install也可以按住c…

【day11】面向对象编程进阶(继承)

概述 本文深入探讨面向对象编程的核心概念&#xff0c;包括继承、方法重写、this和super关键字的使用&#xff0c;以及抽象类和方法的定义与实现。通过本文的学习&#xff0c;你将能够&#xff1a; 理解继承的优势。掌握继承的使用方法。了解继承后成员变量和成员方法的访问特…

高效准确的PDF解析工具,赋能企业非结构化数据治理

目录 准确性高&#xff1a;还原复杂版面元素 使用便捷&#xff1a;灵活适配场景 贴心服务&#xff1a;快速响应机制 在数据为王的时代浪潮中&#xff0c;企业数据治理已成为组织优化运营、提高竞争力的关键。随着数字化进程的加速&#xff0c;企业所积累的数据量呈爆炸式增长…

Unity全局雾效

1、全局雾效是什么 全局雾效&#xff08;Global Fog&#xff09;是一种视觉效果&#xff0c;用于在3D场景中模拟大气中的雾气对远处物体的遮挡 它通过在场景中加入雾的效果&#xff0c;使得距离摄像机较远的物体看起来逐渐被雾气覆盖&#xff0c;从而创造出一种朦胧、模糊的视…

解决Apache/2.4.39 (Win64) PHP/7.2.18 Server at localhost Port 80问题

配置一下apache里面的配置文件&#xff1a;httpd.conf 和 httpd.vhosts.conf httpd.conf httpd-vhosts.conf 重启服务 展示&#xff1a; 浏览器中中文乱码问题&#xff1a;

【Spring事务】深入浅出Spring事务从原理到源码

什么是事务 保证业务操作完整性的一种数据库机制 &#xff08;driver 驱动&#xff09;事务特定 ACID A 原子性 &#xff08;多次操作 要不一起成功 要不一起失败 &#xff08;部分失败 savepoint&#xff09;&#xff09; C 一致性 &#xff08;事务开始时数据状态&#xff0c…

MFC/C++学习系列之简单记录13

MFC/C学习系列之简单记录13 前言memsetList Control代码注意 总结 前言 今天记录一下memset和List control 的使用吧&#xff01; memset memset通常在初始化变量或清空内存区域的时候使用&#xff0c;可以对变量设定特定的值。 使用&#xff1a; 头文件&#xff1a; C&#…

C# cad启动自动加载启动插件、类库编译 多个dll合并为一个

可以通过引用costura.fody的包&#xff0c;编译后直接变为一个dll 自动加载写入注册表、激活码功能: 【CAD二次开发教程-实例18-启动加载与自动运行-哔哩哔哩】 https://b23.tv/lKnki3f https://gitee.com/zhuhao1912/cad-atuo-register-and-active

Android Studio AI助手---Gemini

从金丝雀频道下载最新版 Android Studio&#xff0c;以利用所有这些新功能&#xff0c;并继续阅读以了解新增内容。 Gemini 现在可以编写、重构和记录 Android 代码 Gemini 不仅仅是提供指导。它可以编辑您的代码&#xff0c;帮助您快速从原型转向实现&#xff0c;实现常见的…

固定电话采用的是模拟信号还是数字信号?如果通话两端采用不同的信号会发生什么?

固定电话信号大揭秘&#xff1a;模拟与数字信号的纠缠 模拟信号 VS 数字信号&#xff1a;谁是电话界的“老江湖”&#xff1f; 固定电话采用的是模拟信号还是数字信号&#xff1f; 这其实取决于接入方式&#xff1a; 铜线接入&#xff1a;传统方式&#xff0c;使用模拟电信号…

<项目代码>YOLO Visdrone航拍目标识别<目标检测>

项目代码下载链接 &#xff1c;项目代码&#xff1e;YOLO Visdrone航拍目标识别&#xff1c;目标检测&#xff1e;https://download.csdn.net/download/qq_53332949/90163918YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一…