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

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从控制台打印的日志可以发现&#xff…...

十、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. 孤岛的总面积//思路大概是先计算面积&#xff0c;然后如果有接触路面就返回false。可能稍微多余算了太多无用面积。 #include<bits/stdc.h> using namespace std; void sum(vector<vector<bool>>& finded,const vector<vector<int>>&a…...

别再乱装CUDA了!用Anaconda为你的3060 Ti一键搞定PyTorch GPU环境(含CUDA 11.3实战)

3060 Ti显卡玩家的PyTorch环境配置指南&#xff1a;用Anaconda避开CUDA版本地狱 在深度学习领域&#xff0c;GPU加速已经成为提升模型训练效率的标配。然而&#xff0c;对于许多刚入门的开发者来说&#xff0c;配置PyTorch的GPU支持往往成为第一道门槛——尤其是当涉及到CUDA版…...

终极免费Switch模拟器yuzu:解决电脑玩任天堂游戏的5大痛点

终极免费Switch模拟器yuzu&#xff1a;解决电脑玩任天堂游戏的5大痛点 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu 想在电脑上畅玩Switch游戏却总是遇到各种问题&#xff1f;yuzu模拟器作为全球最受欢迎的开源任…...

NS-USBLoader终极指南:3步搞定Switch游戏管理与RCM注入的完整教程

NS-USBLoader终极指南&#xff1a;3步搞定Switch游戏管理与RCM注入的完整教程 【免费下载链接】ns-usbloader Awoo Installer and GoldLeaf uploader of the NSPs (and other files), RCM payload injector, application for split/merge files. 项目地址: https://gitcode.c…...

Supabase AI Agent技能库:安全集成数据库操作与边缘函数调用

1. 项目概述&#xff1a;当Supabase遇上AI Agent&#xff0c;一个技能库的诞生最近在捣鼓AI Agent应用开发&#xff0c;发现一个挺有意思的现象&#xff1a;大家都能用LangChain、LlamaIndex这些框架快速搭出个Agent的架子&#xff0c;但真想让这个Agent去干点具体、有用的活儿…...

Obsidian智能模板终极指南:3步打造高效笔记自动化系统

Obsidian智能模板终极指南&#xff1a;3步打造高效笔记自动化系统 【免费下载链接】Templater A template plugin for obsidian 项目地址: https://gitcode.com/gh_mirrors/te/Templater Templater插件是Obsidian生态系统中功能最强大的智能模板解决方案&#xff0c;它能…...

构建个人代码仓库:提升开发效率的实践指南

1. 项目概述&#xff1a;一个面向21世纪开发者的代码仓库最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“21st-dev/1code”。光看这个名字&#xff0c;你可能觉得有点抽象&#xff0c;但点进去之后&#xff0c;我发现它其实是一个挺有想法的代码仓库。这个项目没有复杂的…...

设计师速存!Midjourney未公开的风格隐藏开关:--style raw、--s 750、--no texture三者协同作用的神经渲染原理(GPU显存占用下降41%实测)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;设计师速存&#xff01;Midjourney未公开的风格隐藏开关&#xff1a;--style raw、--s 750、--no texture三者协同作用的神经渲染原理&#xff08;GPU显存占用下降41%实测&#xff09; Midjourney v6.1…...

AI智能体记忆系统设计:从RAG到长期记忆的工程实践

1. 项目概述&#xff1a;从“记忆”到“智能”的跨越在AI智能体&#xff08;Agent&#xff09;的开发浪潮中&#xff0c;我们常常面临一个核心挑战&#xff1a;如何让智能体在复杂的、多轮次的交互中&#xff0c;表现得像一个真正有“记忆”和“经验”的专家&#xff1f;传统的…...

Windows鼠标指针主题定制:从.cur/.ani文件到个性化交互体验

1. 项目概述&#xff1a;一个为Windows终端注入灵魂的鼠标指针主题如果你和我一样&#xff0c;每天有超过8小时的时间是与Windows操作系统相伴的&#xff0c;那么你对那个千篇一律的白色箭头鼠标指针&#xff0c;恐怕早已感到审美疲劳。它就像一个沉默的、功能性的背景板&#…...

从仿生结构到步态算法:8自由度并联腿机器狗行走全解析

1. 8自由度并联腿机器狗的结构奥秘 第一次拆解机器狗时&#xff0c;我对着那些复杂的连杆结构发了半小时呆。直到发现它的腿部运动原理和公园里的跷跷板惊人相似——这个发现让我瞬间理解了8自由度并联腿的精妙之处。这种结构就像给机器人装上了"机械肌腱"&#xff0…...