【C语言进阶C++】 C++基础--让你丝滑的从C语言进阶到C++

news2024/11/19 0:21:48

目录

前言

正文

1. 面向过程、面向对象

面向过程思维

面向对象思维

面向过程语言优缺点

面向对象语言优缺点

C++面向对象特点

2. 输入、输出

C++中的输入输出

 总结C和C++输入输出

3. 命名空间

作用域

命名空间

4. 动态申请空间

C++动态申请空间(new、delete)

C和C++动态申请空间的区别

5. bool

6.string

7.增强的范围for

8.函数重载

9.nullptr

NULL和nullptr

 nullptr解决的问题

C++中NULL和nullptr的区别

10.引用

概念

函数传参的三种方式:值传递、地址传递、引用传递

引用和指针的区别

结语


前言

请没有学完C语言的小伙伴先去看 【C语言】 知识点汇总--基础知识点梳理(超全超详细)以及 《C语言技术体系》 学习路线总目录 + 思维导图 ,那里有很全很详细的C语言知识点和学习路线。

  废话不多说,我们直接进入正文,看完本文保证能让你特别丝滑的从C语言进阶到C++!


正文

1. 面向过程、面向对象

面向过程思维

C语言采用了一种有序的编程方法-结构化编程:将一个大型程序分解为一个个小型的、易于编写的模块,所有的模块有序的调动起来,形成了一个程序的完整的运行链。这种结构化编程反映出来过程性编程的思想,即C语言是一门面向过程的语言,更注重程序实现逻辑、怎么更好、更快、更直接的完成某一功能。

C语言是种面向过程编程的语言,在编写大型项目时,并不利于程序的复用性、扩展性,导致了在后期维护时带来了很多繁琐的工作,面临巨大挑战。针对于此,OOP(Object-Oriented Programming)的概念诞生了,与结构化编程不同的是,OOP更注重数据,让语言来满足问题的需求,设计出与问题本质特性相对应的数据格式。

面向对象思维

OOD(Object-Oriented Design):面向对象的设计,OOA(Object-Oriented Analysis):面向对象的分析

C++是一门面向对象编程的语言,把问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为,更注重的是程序的整体设计,方便程序后期维护、优化和管理,让一个功能尽可能的通用。面向对象编程只有一个价值:应对需求的变化,本意是要处理大型复杂系统的设计和实现。

常说的面向过程和面向对象,其本质还是在其设计思想上。

面向过程语言优缺点

优点:性能比面向对象高,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。

缺点:没有面向对象易维护、易复用、易扩展。

面向对象语言优缺点

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。

缺点:因为类调用时需要实例化,开销比较大,比较消耗资源,性能比面向过程低。

C++面向对象特点

C++是由C衍生出来的一门语言,不但兼容包含了C语言还增加了一些新特性函数重载,;类、继承、多态,支持泛型编程(模板函数、模板类),强大的STL库等。

面向对象的三大特性:封装、继承、多态

 概念介绍:

  1. 封装:将零散的数据和算法放到一个集合里,方便管理和使用。
  2. 复用性:公共功能、过程的抽象,体现为能被复用使用的类、方法就要求我们针对某一类功能而不是针对某一个功能去设计。
  3. 扩展性:增加新的功能不影响原来已经封装好的功能。

2. 输入、输出

C++中的输入输出

C++ 中的输出使用cout对象,输入使用cin对象,他是定义在文件iostream命名空间std中的ostream和istream类对象,此文件已经默认包含了stdio.h文件,所以仍然可以使用C中的printf,scanf等。

使用输出、输入两步走:1.包含头文件;2.打开标准命名空间std。常用写法如下:

#include <iostream>   //引入文件,已经包含了#include <stdio.h>
using namespace std;  //打开标准命名空间 std

cout输出需要结合<<输出操作符一起使用,对于内置的基本类型来说,可直接输出。

输出时换行使用endl,其本质上是函数,作用是插入换行符并刷新输出流。

cin输入需要结合>>输入操作符一起使用,对于内置的基本类型来说,可直接输入,但与scanf不同的是,不需要对变量取地址(&)。

#include <iostream>   //1.包含对应的头文件
using namespace std;  //2.打开std标准命名空间

int a = 0;
char b = 'b';
cin>>a>>b;    //不需要使用&取地址符号
cout<<a<<"  "<<b<<endl;

 总结C和C++输入输出

C中的格式化输出更加灵活些,但是写起来相对复杂一些,C++中的cin、cout简单易用,根据不同的场景选择合适的输入输出方法。

3. 命名空间

作用域

作用域运算符 ::,作用域::成员 指明了成员的归属范围,如果 :: 前不加任何作用域,代表取全局作用域。常用的作用域有命名空间、结构体、类等。

int A = 10;
void fun() {
    int A = 1;
    cout<< A <<endl;   //1   局部
    cout<< ::A <<endl; //10  全局
}

对于全局和局部作用域可以定义相同的成员,但如果同一个作用域存在相同的成员,则会报重定义的错误。可以使用命名空间去区分。

命名空间

namespace :C++中的关键字,用于定义命名空间,命名空间主要用于区分同一个作用域下的相同成员。定义命名空间:

namespace 命名空间名
{
    变量...
    函数...
    结构体...
};

使用命名空间:

  1. using编译指令打开命名空间,using namespace 命名空间,这是一种懒惰的做法,打开一次里面的成员将全部对外开放。打开了多个命名空间如果成员相同会出现二义性。
  2. 显示指定命名空间成员,命名空间::成员,这种方式简单直接,如:std::cout<<10;,但是每次使用的时候都需要指明命名空间。

4. 动态申请空间

C++动态申请空间(new、delete)

在C中使用malloc,free来动态申请、释放堆区内存空间,使用时需要显示的指定申请空间的大小。而在C++中使用两个关键字:new,delete来动态申请、释放空间,同样操作的是堆区,new申请空间不需要指定空间大小,而是指定类型,根据类型自动计算所需要的空间大小,并返回申请内存空间的地址,地址指向的类型为new后写的类型,格式:type * pointer = new type,例:

int *p1 = new int;
int *p2 = new int(10);  //申请空间并初始化

new数组返回的是首元素的首地址。

int *p1 = new int[10];
int *p2 = new int[10]();    //新建int类型数组并初始化,每个元素为0
char *p3 = new char[10]();  //新建char类型数组并初始化,每个元素为空字符'\0'

对于数组空间回收,在指针前一般加上[],代表回收整个数组空间。

delete []p1;
delete []p2;
delete []p3;

delete回收空间并不包括指针本身,而是指针指向的内存空间,同一块内存空间不要重复释放,除非指针已经被赋空,对空指针使用delete是安全的。对栈区的内存空间不能使用delete来释放。

C和C++动态申请空间的区别

  1. new、delete是关键字,需要C++的编译器支持,malloc()、free()是函数,需要头文件支持。
  2. new申请空间不需要指定申请大小,根据类型自动计算,new返回的是申请类型的地址,不需要强转,malloc()需要显示的指定申请空间的大小(字节),返回void*,需要强转成我们需要的类型。
  3. new申请空间的同时可以设置初始化,而malloc需要手动赋值。
  4. 至关重要的一点:new申请类、结构体对象内存空间会调用构造函数,delete会调用类、结构体的析构函数,单独的malloc()和free()则不会调用构造、析构函数。

5. bool

BOOL类型定义在minwindef.h中,我么使用的时候通常只需要包含#include <windows.h>即可,这是windows系统给我们提供的,并不是C++自带的类型。它是对int类型起的一个别名。

typedef int       BOOL;
#define FALSE     0
#define TRUE      1

所以BOOL类型的变量占用4个字节的内存空间。

C++中也提供了一种bool类型,关键字,占用一个字节,对应的真假为true、false

6.string

string是C++提供的字符串存储、操作的类需要包含头文件并打开std命名空间。

#include <string>
using namespace std;

其天然支持字符串的初始化、赋值、比较、拼接、下标访问等操作。

字符串的截取需要用函数substr,并返回截取后的字符串。

_Myt substr(size_type _Off = 0,    //字符串截取的下标,从0开始,如果下标超限则访问越界
size_type _Count = npos)   //截取的长度,如果长度超限制,则取有效长度

size() , length()则返回字符串的长度(字符数量)。

将string类型转换为字符指针,用:

const char *c_str()

7.增强的范围for

通常我们遍历数组时,常用的写法for(;;),新标准允许了下面简化的写法:

type arr[n];
for(type val:arr)  //== type val = arr[i]

增强的for循环这种遍历方式,适用于普通的数组、string、和支持begin,end操作的容器等。

8.函数重载

C++中允许函数的参数列表指定默认值,而且这个默认值必须从右向左依次指定,不能间断,一般在函数的声明中去指定,在函数的定义中指定编译可能不会报错,但多数情况下是毫无意义的操作。

void fun(int a,int b = 30);  //函数声明

void fun(int a, int b){      //函数定义
    cout<< a << "  " << b << endl;
}

函数重载:在同一个作用域,函数名一样,参数列表不同(参数类型、数量、顺序等不同)。注意函数重载描述的是多个函数之间的关系。

void fun();
void fun(int ,char);
void fun(int ,int);
void fun(int ,int ,int);

函数的重载使得C++程序员对完成类似功能的不同函数可以统一命名,减少了命名所花的心思。再调用函数时,编译器会根据实参的类型、数量自动匹配对应类型函数。

9.nullptr

NULL和nullptr

我们在使用指针的时候,要尽量避免野指针的存在,即定义了就要初始化,如果暂时不知道具体指向那块空间,那么可以初始化为空,我们有两种方式 :NULL和nullptr(C++11新标准引入的),

int *p1 = NULL;

在C++中NULL被如下定义:

//stio.h
/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL  0

 nullptr解决的问题

我们看到NULL他是一个宏,在C++中被明确定义为整数0,这就导致了整型与指针的混用,nullptr的出现解决了这个问题,他明确了自己的定义,空指针。

nullptr C++11新标准引入的一个关键字,代表是空指针,如果出现了多个类型的空指针,仍然会语义不明确,则需要使用强转来明确空指针的类型。

C++中NULL和nullptr的区别

  1. NULL是宏替换的0,nullptr是关键字。
  2. 含义不同,nullptr代表是空指针,NULL代表整型数字。

10.引用

概念

引用:使用&符号定义引用,给某个变量起别名,定义引用就要初始化

int a = 10;
int &b = a;

引用与被引用的变量指的是同一块内存空间,对被引用操作就是对原变量进行操作。

引用不是值不占用内存空间,且引用一旦被初始化,就不能再重新引用其他空间。

函数传参的三种方式:值传递、地址传递、引用传递

对于一些基本的数据类型值传递问题不大,但是对于一些复合类型来说,参数中的局部变量会占用空间(虽然调用函数结束空间会自动被回收),对于结构体、类来说会调用构造、析构,可能出现浅拷贝的问题,所以复合类型强烈不建议使用值传递。如果想要在函数内修改外面的实参的值,则使用引用和指针。

引用和指针的区别

  1. 引用定义了就要初始化,指针可不用初始化(但不推荐)。
  2. 引用初始化后就不能再重新引用其他的变量、空间,指针可以随意指向。
  3. 有NULL的指针,没有NULL的引用。
  4. 指针变量额外占用空间,引用不额外申请空间。
  5. 指针可以有多级,但引用只能有一级。

结语

那么本篇进阶C++就此结束了,希望对你的学习能有所帮助。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode刷题之回文链表和交换链表中的结点

竭力履行你的义务&#xff0c;你应该就会知道&#xff0c;你到底有多大的价值。 --列夫.托尔斯泰 目录 &#x1fab4;一.回文链表 &#x1f33b;1.快慢指针 &#x1f341;2.把值存入数组中&#xff0c;然后使用双指针 &#x1f33c;二.交换链表中的结点 &#x1…

经典论文解读 — 端到端的VL预训练网络SOHO

来源&#xff1a;投稿 作者&#xff1a;摩卡 编辑&#xff1a;学姐 论文标题&#xff1a; Seeing Out of tHe bOx :End-to-End Pre-training for Visual-Language Representation Learning》 Motivation 本文针对目前大量Visual-Language(VL) tasks使用由Faster-RCNN提取出的…

余弦相似度公式推导及代码实现

余弦相似度公式推导 1. 为什么使用余弦值相似度&#xff1f;2. 公式推导2.1 三角函数余弦公式推导2.2 三角函数向量余弦公式推导 3. 余弦相似度代码实现 1. 为什么使用余弦值相似度&#xff1f; 空间维度上两个点之间相似定义 在空间维度上两个点之间是有夹角和方向&#xff0…

计算机操作系统实验:页面置换算法的实现

目录 前言实验目的实验内容实验过程最佳置换算法代码实现算法流程流程图设计思路运行结果 先进先出算法代码实现算法流程流程图设计思路运行结果 最近最久未使用算法代码实现算法流程流程图设计思路运行结果 总结 前言 本实验的目的是通过编程模拟不同的页面置换算法&#xff…

基于思科模拟器的路由与交换实训报告(单臂路由、三层交换机实现vlan通信、ospf、rip、dhcp、acl、nat技术总结)

本博客是路由与交换实训报告&#xff0c;基于思科模拟器分别做了单臂路由、三层交换机实现vlan间通信、ospf、rip、dhcp、nat的实验&#xff0c;最后的nat综合实验是本次实训的大拓扑&#xff0c;综合了上述的几个技术。 大家可以当作一些思科小实验的总结&#xff0c;供网络工…

数据库管理-第七十二期 复盘(20230505)

数据库管理 2023-05-05 第七十二期 复盘1 再测试2 对照分析&#xff1a; 3 如何解决总结 第七十二期 复盘 上一期的内容&#xff0c;我承认主要是在放假&#xff0c;分析过程还是水了一点&#xff0c;SR转回国内之后&#xff0c;处理效率还是提升了一大截。 1 再测试 在客户…

Linux - 第11节 - 网络基础(一)

1.计算机网络背景 1.1.网络发展 独立模式&#xff1a;计算机之间相互独立 在早期的时候&#xff0c;计算机之间是相互独立的&#xff0c;此时如果多个计算机要协同完成某种业务&#xff0c;那么就只能等一台计算机处理完后再将数据传递给下一台计算机&#xff0c;然后下一台计…

Python进阶——实现人脸识别

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 今天我们来实现一下人脸识别~ 先问大家一个问题 什么是百度Aip模块&#xff1f; 百度AI平台提供了很多的API接口供开发者快速的调用运用在项目中 本文写的是使用百度AI的在线接口SDK模块&#xff08;baidu-aip&#…

单链表——单链表的定义及基本操作(初始化、头插法尾插法建表、查找、插入、删除、判空等)

单链表的定义 由于顺序表存在以下缺陷&#xff0c;所以衍生出了链表&#xff0c;而链表种类有很多种&#xff0c;今天我们讲的是单链表。 顺序表存在的问题如下 1.中间/头部的插入删除&#xff0c;时间复杂度为O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释…

CPU 架构(x86/ARM)简介

CPU 架构通过指令集的方式一般可分为 复杂指令集&#xff08;CISC&#xff09; 和 精简指令集&#xff08;RISC&#xff09; 两类&#xff0c;CISC 主要是 x86 架构&#xff0c;RISC 主要是 ARM 架构&#xff0c;还有 MIPS、RISC-V、PowerPC 等架构。 本文重点介绍 x86 和 ARM…

idea中maven的几个操作按钮:clean、validate、compile...

idea中Maven生命周期指令 clean命令 清除由项目编译创建的target validate命令 验证项目是否正确&#xff0c;并且所有必要的信息均可用 compile命令 编译项目的源代码 test命令 使用合适的单元测试框架来测试编译的源代码。 这些测试不应要求将代码打包或部署 verify命令 …

智安网络|一文看懂内核平台和系统服务的联系

内核平台和系统服务是操作系统中两个非常重要的组成部分。内核平台是系统底层的核心&#xff0c;负责管理和控制计算机硬件和资源的访问。而系统服务则是在内核之上运行的程序集合&#xff0c;为操作系统提供各种功能和服务。 内核平台和系统服务的关联非常密切。系统服务必须…

Emqx的简单使用

Emqx 是一个mqtt 的服务器产品。之前activemq可以作为mqtt协议的服务器&#xff0c;但是功能相对来说比较单一。Emqx作为跟Mqtt协议相关的新一代产品&#xff0c;功能实际上更为强大。 它的功能也主要体现在可视化/认证/规则/httpApi 上面。 1.Emqx 的安装 这里采用了docker…

JMeter 计算上一个接口取值到本次接口进行四则运算赋值

项目场景&#xff1a; 公司项目需要接口关联计算进行赋值&#xff1a; 项目场景&#xff1a;A接口提取的返回值&#xff0c;在传到B接口使用时&#xff0c;需要先进行四则运算后&#xff0c;再赋值使用。 A接口提取的值 B接口需要使用计算后的值 问题描述 使用beanshell预…

必须掌握的ArrayList,LinkedList,HashMap,HashTable,Collection,Colections

人的自由并不在于可以做他想做的事&#xff0c;而在于可以不做他不想做的事。 ArrayList和linkedList的区别 Array数组是基于索引&#xff08;index&#xff09;的数据结构&#xff0c;它使用索引在数组中搜索和读取数据是很快的 Array获取数据的时间复杂度是o(1)&#xff…

南卡OE系列再添新成员,造型犀利有型,性能强劲动听!

科技的快速发展让消费者对智能互联、操作体验、设计审美、安全健康等需求越发高涨&#xff0c;蓝牙耳机也正在由功能性向舒适性方向发展。如何提高蓝牙耳机的舒适度、拥有更舒适的听歌体验&#xff0c;成为蓝牙耳机品牌和消费者共同努力的方向。 Nank南卡&#xff1a;更专业的骨…

【Linux】单机版QQ之管道中的命名管道

还记得上一篇的匿名管道吗&#xff1f; 文章目录 前言一、命名管道总结 前言 命名管道是什么呢&#xff1f; 管道应用的一个限制就是只能在具有共同祖先&#xff08;具有亲缘关系&#xff09;的进程间通信。 如果我们想在不相关的进程之间交换数据&#xff0c;可以使用FIFO文…

一百零七、MySQL数据库的数据备份与数据恢复

MySQL数据库的数据备份与恢复主要有3种方法&#xff0c;前两种都是MySQL dump命令&#xff0c;第三种则是用Navicat工具直接备份。相比而言&#xff0c;第三种方法更加简单&#xff01; 1 方法一&#xff08;MySQL dump命令&#xff09; 1.1 登录MySQL [roothurys22 ~]# mysq…

Maya云渲染如何使用,Maya云渲染流程实操!

Maya 是一款专业的 3D 软件&#xff0c;用于创建逼真的角色和大片的效果&#xff0c;Maya可以加速工作流程&#xff0c;帮助您专注于创造力并按时完成任务。也可以为角色和场景添加精美的细节&#xff0c;并提供让客户满意的优质作品。更有无数业内顶级艺术家依靠 Maya来创作更…

【Halcon】新建程序 读取图片 路径设置

文章目录 1 新建程序2 读取一张图片3 图片路径4 图片格式读取报错5 快速添加 绝对路径 1 新建程序 点击新程序图标&#xff0c;即可新建&#xff1b; 程序另存为&#xff0c;会弹出保存路径 2 读取一张图片 read_image(Image,fabrik)此时工程路径下并没有图片&#xff1b; …