NO2.C++语言基础|C++和Java|常量|重载重写重定义|构造函数|强制转换|指针和引用|野指针和悬空指针|const修饰指针|函数指针(C++)
6. C++ 和 Java 区别(语⾔特性,垃圾回收,应⽤场景等)
指针:
Java 语⾔让程序员没法找到指针来直接访问内存,没有指针的概念,并有内存的⾃动管理功能,从⽽有效的防⽌了 C++ 语⾔中的指针操作失误的影响。但并⾮ Java 中没有指针, Java 虚拟机内部中还是⽤了指针,保证了 Java 程序的安全。
多重继承:
C++ ⽀持多重继承但 Java 不⽀持,但⽀持⼀个类继承多个接⼝,实现 C++ 中多重继承的功能,⼜避免了 C++ 的多重继承带来的不便。
数据类型和类:
Java 是完全⾯向对象的语⾔,所有的函数和变量必须是类的⼀部分。除了基本数据类型之外,其余的都作为类对象,对象将数据和⽅法结合起来,把它们封装在类中,这样每个对象都可以实现⾃⼰的特点和⾏为。 Java 中取消了 C++ 中的 struct 和 union 。
⾃动内存管理:
Java 程序中所有对象都是⽤ new 操作符建⽴在内存堆栈上, Java ⾃动进⾏⽆⽤内存回收操作,不需要程序员进⾏⼿动删除。⽽ C++ 中必须由程序员释放内存资源,增加了程序设计者的负担。 Java 中当⼀个对象不再被⽤到时, ⽆⽤内存回收器将给他们加上标签。 Java ⾥⽆⽤内存回收程序是以线程⽅式在后台运⾏的,利⽤空闲时间⼯作来删除。
Java 不⽀持操作符重载。操作符重载被认为是 C++ 的突出特性。
Java 不⽀持预处理功能。 C++ 在编译过程中都有⼀个预编译阶段, Java 没有预处理器,但它提供了 import 与 C++ 预处理器具有类似功能。
类型转换:
C++ 中有数据类型隐含转换的机制, Java 中需要限时强制类型转换。
字符串:
C++中字符串是以 Null 终⽌符代表字符串的结束,⽽ Java 的字符串 是⽤类对象(string 和 stringBuffer)来实现的。
Java 中不提供 goto 语句,虽然指定 goto 作为关键字,但不⽀持它的使⽤,使程序简洁易读。
Java 的异常机制⽤于捕获例外事件,增强系统容错能⼒
7. 说⼀下 C++ ⾥是怎么定义常量的?常量存放在内存的哪个位置?
对于局部常量,存放在栈区;
对于全局常量,编译期⼀般不分配内存,放在符号表中以提⾼访问效率;
字⾯值常量,⽐如字符串,放在常量区
8. C++ 中重载和重写,重定义的区别
重载
翻译⾃ overload,是指同⼀可访问区内被声明的⼏个具有不同参数列表的同名函数,依赖于C++函数名字的修饰会将参数加在后⾯,可以是参数类型,个数,顺序的不同。根据参数列表决定调⽤哪个函数,重载不关⼼函数的返回类型。
重写
翻译⾃ override,派⽣类中重新定义⽗类中除了函数体外完全相同的虚函数,注意被重写的函数不能是 static 的,⼀定要是虚函数,且其他⼀定要完全相同。要注意,重写和被重写的函数是在不同的类当中的,重写函数的访问修饰符是可以不同的,尽管 virtual 中是 private 的,派⽣类中重写可以改为 public。
重定义(隐藏)
派⽣类重新定义⽗类中相同名字的⾮ virtual 函数,参数列表和返回类型都可以不同,即⽗类中除了定义成 virtual 且完全相同的同名函数才不会被派⽣类中的同名函数所隐藏(重定义)。
9. 介绍 C++ 所有的构造函数
类的对象被创建时,编译系统为对象分配内存空间,并⾃动调⽤构造函数,由构造函数完成成员的初始化⼯作。
即构造函数的作⽤:初始化对象的数据成员。
⽆参数构造函数:
即默认构造函数,如果没有明确写出⽆参数构造函数,编译器会⾃动⽣成默认的⽆参数构造函数,函数为空,什么也不做,如果不想使⽤⾃动⽣成的⽆参构造函数,必需要⾃⼰显示写出⼀个⽆参构造函数。
⼀般构造函数:
也称重载构造函数,⼀般构造函数可以有各种参数形式,⼀个类可以有多个⼀般构造函数,前提是参数的个数或者类型不同,创建对象时根据传⼊参数不同调⽤不同的构造函数。
拷⻉构造函数:
拷⻉构造函数的函数参数为对象本身的引⽤,⽤于根据⼀个已存在的对象复制出⼀个新的该类的对象,⼀般在函数中会将已存在的对象的数据成员的值⼀⼀复制到新创建的对象中。如果没有显示的写拷⻉构造函数,则系统会默认创建⼀个拷⻉构造函数,但当类中有指针成员时,最好不要使⽤编译器提供的默认的拷⻉构造函数,最好⾃⼰定义并且在函数中执⾏深拷⻉。
类型转换构造函数:
根据⼀个指定类型的对象创建⼀个本类的对象,也可以算是⼀般构造函数的⼀种,这⾥提出来,是想说有的时候不允许默认转换的话,要记得将其声明为 explict 的,来阻⽌⼀些隐式转换的发⽣。
赋值运算符的重载:
注意,这个类似拷⻉构造函数,将=右边的本类对象的值复制给=左边的对象,它不属于构造函数,=左右两边的对象必需已经被创建。如果没有显示的写赋值运算符的重载,系统也会⽣成默认的赋值运算符,做⼀些基本的拷⻉⼯作。
A a1, A a2; a1 = a2;//调⽤赋值运算符
A a3 = a1;//调⽤拷⻉构造函数,因为进⾏的是初始化⼯作, a3 并未存在
10. C++ 的四种强制转换
C++ 的四种强制转换包括: static_cast, dynamic_cast, const_cast, reinterpret_cast
static_cast:
明确指出类型转换,⼀般建议将隐式转换都替换成显示转换,因为没有动态类型检查,上⾏转换(派⽣类->基类)安全,下⾏转换(基类->派⽣类) 不安全,所以主要执⾏⾮多态的转换操作;
dynamic_cast:
专⻔⽤于派⽣类之间的转换, type-id 必须是类指针,类引⽤或 void*,对于下⾏转换是安全的,当类型不⼀致时,转换过来的是空指针,⽽static_cast,当类型不⼀致时,转换过来的事错误意义的指针,可能造成⾮法访问等问题。
const_cast:
专⻔⽤于 const 属性的转换,去除 const 性质,或增加 const 性质, 是四个转换符中唯⼀⼀个可以操作常量的转换符。
reinterpret_cast:
不到万不得已,不要使⽤这个转换符,⾼危操作。使⽤特点: 从底层对数据进⾏重新解释,依赖具体的平台,可移植性差; 可以将整形转 换为指针,也可以把指针转换为数组;可以在指针和引⽤之间进⾏肆⽆忌惮的转换。
11. 指针和引⽤的区别
指针和引⽤都是⼀种内存地址的概念,区别呢,指针是⼀个实体,引⽤只是⼀个别名。
在程序编译的时候,将指针和引⽤添加到符号表中。
编译
指针它指向⼀块内存,指针的内容是所指向的内存的地址,在编译的时候,则是将“指针变量名-指针变量的地址”添加到符号表中,所以说,指针包含的内容是可以改变的,允许拷⻉和赋值,有 const 和⾮ const 区别,甚⾄可以为空, sizeof 指针得到的是指针类型的⼤⼩。
⽽对于引⽤来说,它只是⼀块内存的别名,在添加到符号表的时候,是将"引⽤变量名-引⽤对象的地址"添加到符号表中,符号表⼀经完成不能改变,所以引⽤必须⽽且只能在定义时被绑定到⼀块内存上,后续不能更改,也不能为空,也没有 const 和⾮ const 区别。
sizeof
sizeof 引⽤得到代表对象的⼤⼩。⽽ sizeof 指针得到的是指针本身的⼤⼩。另外在参数传递中,指针需要被解引⽤后才可以对对象进⾏操作,⽽直接对引⽤进⾏的修改会直接作⽤到引⽤对象上。
参数
作为参数时也不同,传指针的实质是传值,传递的值是指针的地址;传引⽤的实质是传地址,传递的是变量的地址。
12. 野(wild)指针与悬空(dangling)指针有什么区别?如何避免?
野指针(wild pointer):
就是没有被初始化过的指针。⽤ gcc -Wall 编译, 会出现 used uninitialized 警告。
悬空指针:
是指针最初指向的内存已经被释放了的⼀种指针。
⽆论是野指针还是悬空指针,都是指向⽆效内存区域(这⾥的⽆效指的是"不安全不可控")的指针。 访问"不安全可控"(invalid)的内存区域将导致"Undefined Behavior"。
如何避免使⽤野指针?
在平时的编码中,养成在定义指针后且在使⽤之前完成初始化的习惯或者使⽤智能指针。
13. 说⼀下 const 修饰指针如何区分?
下⾯都是合法的声明,但是含义⼤不同:
const int * p1;
//指向整形常量 的指针,它指向的值不能修改
int * const p2;
//指向整形的常量指针 ,它不能在指向别的变量,但指向(变量)的值可以修改。
const int *const p3;
//指向整形常量 的 常量指针 。它既不能再指向别的常量,指向的值也不能修改。
理解这些声明的技巧在于,查看关键字const右边来确定什么被声明为常量 ,如果该关键字的右边是类型,则值是常量;如果关键字的右边是指针变量,则指针本身是常量。
14. 简单说⼀下函数指针
从定义和⽤途两⽅⾯来说⼀下⾃⼰的理解:
⾸先是定义:
函数指针是指向函数的指针变量。函数指针本身⾸先是⼀个指针变量,该指针变量指向⼀个具体的函数。这正如⽤指针变量可指向整型变量、字符型、数组⼀样,这⾥是指向函数。
在编译时,每⼀个函数都有⼀个⼊⼝地址,该⼊⼝地址就是函数指针所指向的地址。有了指向函数的指针变量后,可⽤该指针变量调⽤函数,就如同⽤指针变量可引⽤其他类型变量⼀样,
在这些概念上是⼤体⼀致的。
其次是⽤途:
调⽤函数和做函数的参数,⽐如回调函数。
char * fun(char * p) {…} // 函数fun
char * (*pf)(char * p); // 函数指针pf
pf = fun; // 函数指针pf指向函数fun
pf(p); // 通过函数指针pf调⽤函数fun
相关文章:

NO2.C++语言基础|C++和Java|常量|重载重写重定义|构造函数|强制转换|指针和引用|野指针和悬空指针|const修饰指针|函数指针(C++)
6. C 和 Java 区别(语⾔特性,垃圾回收,应⽤场景等) 指针: Java 语⾔让程序员没法找到指针来直接访问内存,没有指针的概念,并有内存的⾃动管理功能,从⽽有效的防⽌了 C 语⾔中的指针…...

【CSS】---- 纯 CSS 实现无限滚动轮播
1. 前言 仅使用 CSS 创建一个具有无限滚动轮播的动画,无需 JavaScript。首先是无限滚动轮播动画效果在我们常见的开发中都是借用 JavaScript 实现,如果纯粹使用 CSS,我觉得还是一个比较有趣的。 2. 效果预览 3. 效果分析 一屏展示了三个图片元素;动画依次向左移动;三个图…...

软考架构师笔记-计算机网络
1.9 计算机网络 OSI/RM 七层模型 物理层 二进制传输(中继器、集线器) (typedef) 数据链路层 传送以帧为单位的信息(网桥、交换机、网卡) 网络层 分组传输和路由选择(三层交换机、路由器)ARP/RARP/IGMP/ICMP/IP 传输层 端到端的连接(TCP/UDP)在前向纠错系统中,当接…...
Spring MVC 页面重定向返回后通过nginx代理 丢失端口号问题处理
Spring MVC页面重定向通过Nginx代理后出现端口丢失问题,通常由以下原因及解决方案构成: ## 一、Nginx配置问题(核心原因) 1. Host头传递不完整 Nginx默认未将原始请求的端口信息传递给后端,导致应用生成重定向…...
道可云人工智能每日资讯|亚马逊云业务部门成立智能体人工智能团队
道可云元宇宙每日简报(2025年3月6日)讯,今日元宇宙新鲜事有: 《杭州市富阳区未来产业培育行动计划(2025-2026年)》发布 3月3日,杭州市富阳区经信局正式发布了《杭州市富阳区未来产业培育行动计划(2025-2026年)》&…...
算力100问☞第72问:算力与算法、数据的关系是什么?
目录 1、数据是基础 2、算法是核心 3、算力是保障 4、三者的关系 5、实际应用中的体现 算力、算法和数据是人工智能和计算机科学领域的三个核心要素,它们之间相互依赖、相互促进,共同构成了现代计算系统的基础。以下是它们之间的关系: 1、数据是基础 定义:数据是信息…...
AI-Ollama本地大语言模型运行框架与Ollama javascript接入
1.Ollama Ollama 是一个开源的大型语言模型(LLM)平台,旨在让用户能够轻松地在本地运行、管理和与大型语言模型进行交互。 Ollama 提供了一个简单的方式来加载和使用各种预训练的语言模型,支持文本生成、翻译、代码编写、问答等多种…...
Java开发的AI应用框架简述——LangChain4j、Spring AI、Agent-Flex
LangChain4j LangChain4j官网 star很多,文档齐全,在AI服务中,提供了丰富的功能,示例代码丰富。 简介 是一个功能丰富、易于使用的Java AI开发框架,特别适合需要快速集成和使用大型语言模型的Java开发者。 项目特点 …...

【算法day2】无重复字符的最长子串 两数之和
无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 https://leetcode.cn/problems/longest-substring-without-repeating-characters/ class Solution { public:int lengthOfLongestSubstring(string s) {int sub_length …...
HarmonyOS:基于hmrouter实现Page的生命周期监听
前言:在使用ArkTs语言写鸿蒙的App中,我们发现Page的生命周期函数,如下: 页面的生命周期(32) onPageShow:页面显示触发(页面特有) onPageHide:页面隐藏触发(页面特有) onBackPress:当用户点击返回按钮时…...

DeepSeek + 飞书多维表格搭建你的高效工作流
众所周知,大模型DeepSeek擅长于处理大规模语言模型推理任务,特别是在成本降低和思维链推理方面表现出色,我们一般把大模型必做我们的大脑,但是一个人不能只有大脑,还需要其他输入输出以及操作支配的眼耳鼻嘴手足等。…...

uniapp+<script setup lang=“ts“>使用 uni.$emit和uni.$on全局传递数据
注意: 在A页面直接使用 uni.$emit(changeCategoryKey, childCategory)传递,在B页面使用 uni.$on(changeCategoryKey, (val) > {console.log(val, 取值);});只在组件传递有效,页面跳转后是无效的 跳转页面使用的传递数据的方法如下&…...

综合使用pandas、numpy、matplotlib、seaborn库做数据分析、挖掘、可视化项目
目录 1.结构化数据挖掘 1.1依赖库导入和数据读取 1.2各品牌机型及售价统计 1.3视频录制规格与价格关联性分析 2.结构化数据预处理 2.1筛选特征 2.2特征标签归一化及编码 1.结构化数据挖掘 1.1依赖库导入和数据读取 导入必要的依赖库,读取 csv 格式数据集转化为 Data…...

docker中kibana启动后,通过浏览器访问,出现server is not ready yet
问题:当我在浏览器访问kibana时,浏览器给我报了server is not ready yet. 在网上试了很多方法,都未能解决,下面是我的方法: 查看kibana日志: docker logs -f kibana从控制台打印的日志可以发现ÿ…...
十、Redis 主从复制:原理解析、配置实践与优化策略
Redis 主从复制:原理解析、配置实践与优化策略 Redis 作为高性能的 NoSQL 数据库,主从复制(Master-Slave Replication) 是其核心特性之一。主从复制用于数据冗余、读负载分担、故障恢复,是 Redis 构建高可用架构的基础。本文将深入解析 Redis 主从复制的配置方法、复制机…...

使用JMeter(组件详细介绍+使用方式及步骤)
JSON操作符 在我们使用请求时,经常会遇到JSON格式的请求体,所以在介绍组件之前我会将介绍部分操作符,在进行操作时是很重要的 Operator Description $ 表示根元素 当前元素 * 通配符,所有节点 .. 选择所有符合条件的节点 .name 子元素,name是子元素名称 [start:e…...

lamp平台的应用
一.lamp介绍 网站: 静态网站 动态网站 【php语言 .php结尾的文件】 作用:运行php语言编写的动态网站应用 lamp LinuxApache【负责解析静态资源】MySQL【负责存储网站产生的数据】PHP【负责解析动态资源】 如上图所示,是lamp平台中三…...

蓝桥杯4T平台(串口打印电压值)
知识点:串口(单片机发送数据)按键ADC 题目 配置 代码 adc.c uint16_t getadc2(void) {uint16_t adc0;HAL_ADC_Start(&hadc2);adcHAL_ADC_GetValue(&hadc2);return adc; } adc.h uint16_t getadc2(void); main.c #include "lcd.h" #include…...
使用ASIWebPageRequest库编写Objective-C下载器程序
使用 ASIWebPageRequest 库编写 Objective-C 下载器程序是一个简单且高效的方式来处理 HTTP 请求。在 ASIHTTPRequest 和 ASIWebPageRequest 中,ASIWebPageRequest 是专门用于下载网页及其资源的库。 1. 安装 ASIWebPageRequest 首先,你需要安装 ASIHT…...
代码随想录算法训练营 | 图论 | 孤岛总面积、沉没孤岛
101. 孤岛的总面积//思路大概是先计算面积,然后如果有接触路面就返回false。可能稍微多余算了太多无用面积。 #include<bits/stdc.h> using namespace std; void sum(vector<vector<bool>>& finded,const vector<vector<int>>&a…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...