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

【C++ 】学习问题及补充

一.自定义类型不初始化直接就赋值,比如string类会怎么样

vectr<string>里已经给每个string对象已经分配好空间,为什么不初始化再赋值会报错

在C++中,std::string类是一个动态字符串类,它内部管理着一个字符数组,用于存储字符串内容。当你创建一个std::string对象时,如果没有指定初始长度,编译器默认会给它分配足够的内存来容纳后续可能添加的字符。如果你已经为std::string对象分配了空间,但没有初始化就直接赋值,这通常不会导致编译错误,因为std::string内部会自动处理这种情况。

然而,不初始化就赋值可能会带来一些潜在的问题:

  1. 未定义行为尽管编译器可能允许你这样做,但这可能导致未定义的行为。因为你没有明确地初始化字符串,其内部状态是不确定的,这意味着它的长度、容量以及所指向的内存可能是随机的。在这种情况下,对字符串的操作(例如,尝试访问其中的字符)可能会产生不可预知的结果。

  2. 效率问题:虽然std::string会根据需要自动调整大小,但频繁的动态调整可能会降低程序性能。每次调用push_backassign等方法时,如果当前的内部缓冲区不足以容纳新的字符,std::string可能需要重新分配更大的内存区域,并复制旧的数据到新位置,这是一个相对耗时的过程。

  3. 内存泄漏的风险:如果你手动分配了一个字符数组(比如使用new char[size]),然后试图将这个数组与std::string关联起来,而没有正确地初始化std::string,那么可能会导致内存泄漏。因为std::string会在析构时释放其管理的内存,但如果它不知道内存是在哪里分配的,就不能正确地执行这一操作。

为了避免这些问题,推荐的做法始终是初始化std::string对象,即使你不提供初始值,也可以传递一个空字符串给构造函数:

std::string myString;  // 初始化为空字符串
myString = "Hello, World!";  // 现在可以安全地赋值

或者,如果你知道字符串的预期最大长度,可以显式指定:

std::string myString(100);  // 分配100个字符的空间,但字符串长度仍为0
myString.assign("Hello, World!");  // 安全地赋值,不需要动态调整大小

这样可以确保你的代码更稳定且高效。


自定义类型不初始化直接就赋值,比如string类会怎么样

如果自定义类型没有被初始化就直接赋值,那么其成员变量的值将是不确定的,也就是未定义行为。对于string类,如果没有被初始化就直接赋值,它的值将是随机的,可能是一些垃圾值,也可能是一个空字符串。这种行为是不可预测的,会导致程序出现不可预期的错误。

建议在使用自定义类型时,一定要先进行初始化,以保证程序的正确性和可靠性。

为什么没有被初始化就直接赋值,它的值将是随机的

计算机中,内存是由一系列的字节构成的,当变量在内存中被定义时,它会被分配一块内存空间。如果这个变量没有被显式初始化,那么这个内存空间中就会存在垃圾数据,这些数据是来自于此前使用这段内存空间的程序留下的信息,因此这个变量的值就是随机的,可能是任何值。所以在使用变量之前必须对其进行初始化操作,否则可能会导致程序出现不可预期的错误。


变量的声明和定义

(摘自)【C/C++面试必备】声明和定义的区别

 声明

声明是用来告诉编译器变量的名称和类型,而不分配内存。

extern int var; // 声明extern int ble =10; // 定义typedef int INT; // 声明struct Node; // 声明

上面代码中,语句 extern int var;表示 var 在别的文件中已经定义,提示编译器遇到此变量时在其它模块中寻找其定义。语句 extern int ble = 10;表示定义了变量 ble,这一点需要注意。

注意:即使是 extern ,如果给变量赋值了,就是定义了。

定义

定义是为了给变量分配内存,可以为变量赋初值。

注意:全局变量或静态变量初始值为0,局部变量初始化为随机值。

在 C/C++ 中,变量的声明和定义区别并不大,定义和声明往往是同时发生,变量定义时,会根据变量类型分配空间,如下所示:

int value ; //声明 + 定义struct Node { // 声明 + 定义int left;int right;
}; 

变量的声明、定义、赋值和初始化都是在预处理阶段进行的吗


二.std::vector::iterator 为什么不重载运算符>>

std::vector::iterator 是一个迭代器,用于遍历 vector 中的元素。它不重载运算符>>,是因为这个运算符已经被用于输入流。如果重载运算符>>,会导致代码的可读性变差,同时也会带来潜在的歧义。

当我们使用输入流时,我们通常使用运算符>>从输入流中读取数据。如果 std::vector::iterator 也重载了这个运算符,那么就无法确定应该调用哪个运算符。这会导致代码的可读性变差,并且可能会出现难以调试的问题。

因此,std::vector::iterator 没有重载运算符>>。如果需要从输入流中读取 vector 中的元素,可以使用其他方式,例如循环遍历 vector 并逐个读取元素。

这些可以重载:++  *(前置) ==


三.iterator end() { return _finish; }可以写成 iterator& end() { return _finish; }吗?

引用返回的话,你改变这个迭代器的指向,那么容器中的迭代器指向也会跟着改变,就会让容器损坏,所以需要的是一个拷贝行为。

iterator beign 和iterator _start是两个不同的哦。


四.不能给初始化列表动态开辟空间

在 C++ 中,初始化列表用于初始化类的成员变量。如果一个类的成员变量需要动态分配内存,那么在初始化列表中是不能进行动态内存分配的。因为初始化列表是在构造函数执行之前执行的,而动态内存分配必须在程序运行时才能完成,所以无法在初始化列表中进行动态内存分配。

举个例子,假设一个类的成员变量包含一个指向 int 类型数组的指针,如果要在构造函数中动态分配内存给这个数组,可以使用 new 操作符来实现。但是,由于初始化列表是在构造函数之前执行的,所以在初始化列表中不能使用 new 操作符来分配内存。


五.具有常性的变量不能引用

具有常性的变量(const variable)是指其值不能被修改的变量。由于其值不可更改,因此不能将其引用给一个非常量变量,因为这样做就会打破 const 变量的常性。而将一个 const 变量引用给一个常量变量是可以的,因为常量变量的值也不会被修改。

例如,以下代码是不合法的:

const int a = 5;
int &b = a; // 错误!不能将 const 变量引用给非常量变量

而以下代码是合法的:

const int a = 5;
const int &b = a; // 正确!可以将 const 变量引用给常量变量

六.模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

C++ 中的模板函数(函数模板)可以被用于多种不同类型的参数,但是这些参数必须在编译时确定,因此模板函数不允许自动类型转换。相反,普通函数可以在参数和返回值之间进行自动类型转换。

例如,以下是一个模板函数和一个普通函数的示例:

// 模板函数
template <typename T>
T getMax(T a, T b) {return (a > b) ? a : b;
}// 普通函数
int getMax(int a, int b) {return (a > b) ? a : b;
}

当你调用 getMax(3, 5) 时,编译器会自动推断出使用普通函数,因为参数是整数类型。但是,当你调用 getMax(3.5, 2.8) 时,编译器将无法确定使用哪个函数,因为参数既可以是 int 类型也可以是 double 类型。在这种情况下,你必须显式地指定类型来调用模板函数。

七.模板满树的声明和定义必须放在一起(比如:vector<T>)

(不同于一般c++函数,声明可以在头文件,定义可以在cpp文件。

模板函数的声明和定义必须放在一起,否则编译链接会报错。

非要分开写的话,需要在cpp文件中进行模板的显式实例化,但这需要把所有用到的T都列出来。或者在头文件末尾include 这个cpp文件,但这本质和写在一个头文件没有区别,而且由于cpp文件往往没有防止重复include的机制,链接时容易报错重复定义。

参考:

类模板的定义和实现必须在一个文件吗_c++ 接口类 实现和定义不在同一个文件

/* a.hpp */
template <typename T>
T func(T input);/* 必须也放在a.hpp */
template <typename T>
T func(T input)
{return input;
}

汉诺塔问题,青蛙跳台,斐波那契数列


汉诺塔问题和青蛙跳台阶问题/汉诺塔和斐波那契数列的递归算法实现

相关文章:

【C++ 】学习问题及补充

一.自定义类型不初始化直接就赋值&#xff0c;比如string类会怎么样 vectr<string>里已经给每个string对象已经分配好空间&#xff0c;为什么不初始化再赋值会报错 在C中&#xff0c;std::string类是一个动态字符串类&#xff0c;它内部管理着一个字符数组&#xff0c;用…...

内存泄漏案例分享3-view的内存泄漏

案例3——view内存泄漏 前文提到&#xff0c;profile#Leaks视图无法展示非Activity、非Fragment的内存泄漏&#xff0c;换言之&#xff0c;除了Activity、Fragment的内存泄漏外&#xff0c;其他类的内存问题我们只能自己检索hprof文件查询了。 下面有一个极佳的view内存泄漏例子…...

红外超声波雷达测距

文章目录 一HC-SR04介绍1HC-SR04简介及工作原理 二用HAL库实现HC-SR04测量距离1STM32CubeMX配置2keil53代码的添加 三效果 一HC-SR04介绍 1HC-SR04简介及工作原理 超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射线而定向传播等…...

AIGC 008-IP-Adapter文本兼容图像提示适配器用于文本到图像扩散模型

AIGC 008-IP-Adapter文本兼容图像提示适配器用于文本到图像扩散模型&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 这篇论文介绍了 IP-Adapter&#xff0c;一种 高效地将预训练的图像到图像转换模型适应到新领域 的方法。它通过在预训练模型的 输入端 添加一个…...

Java入门基础学习笔记50——ATM系统

1、项目演示&#xff1b; 2、项目技术实现&#xff1b; 1&#xff09;面向对象编程&#xff1a; 每个账户都是一个对象&#xff0c;所以要设计账户类Account&#xff0c;用于创建账户对象封装账户信息。ATM同样是一个对象&#xff0c;需要设计ATM类&#xff0c;代表ATM管理系…...

# linux 中使用 visudo 命令,怎么保存退出?

linux 中使用 visudo 命令&#xff0c;怎么保存退出&#xff1f; 在 visudo 中保存并退出的方法取决于您使用的文本编辑器。通常情况下&#xff0c;visudo 会使用 vim 或 vi 或 Nano 作为默认的文本编辑器。 1、使用 Vim 或 vi 编辑器&#xff1a; 按下 Esc 键退出编辑模式&…...

springboot项目,@Test写法 @Before @After

某文件示例 package cn.xxx.crm.boss;import cn.xxxx.crm.manager.mq.rabbit.AliyunCredentialsProvider; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; im…...

vue3的核心API功能:computed()API使用

常规使用方法: 这样是常规使用方法. 另一种,可写计算属性的使用方法: 这样分别定义computed的get回调函数和set回调函数, 上面例子定义了plusOne.value的值为1, 那么这时候就走了computed的set回调函数,而没有走get回调函数. 当我们打印plusOne.value的值的时候,走的是get的…...

Bootstrap5

Bootstrap5-容器 容器是Bootstrap—个基本的构建块&#xff0c;它包含、填充和对齐给定设备或视口中的內容。 Bootstrap 需要一个容器元素来包裏网站的内容 我们可以使用以下两个容器类&#xff1a; .container 类用于固定宽度并支持响应式布局的容器。.container-fluid 类用…...

宝塔部署纯Vue项目,无后端

1.打包项目 生成一个dist文件夹 2.创建云服务器根目录 3.创建站点 4.上传文件 5.访问...

spring boot3整合邮件服务实现邮件发送功能

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 内容概要 开通服务 依赖引入 配置属性 创建邮件发送工具类 测试 最近发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家…...

算法刷题day54:搜索(一)

目录 引言一、池塘计数二、城堡问题三、山峰和山谷四、迷宫问题五、武士风度的牛六、抓住那头牛七、矩阵距离八、魔板 引言 针对于蓝桥杯&#xff0c;搜索问题还是非常之重要的&#xff0c;在省赛前深知暴搜的重要性&#xff0c;所以提前先把提高课的搜索一章给看了&#xff0…...

深入了解Redis的过期策略和内存淘汰机制

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…...

小白不知道怎么投稿?记住这个好方法

作为一名单位信息宣传员,我最初踏上这条道路时,满心憧憬着通过文字传递我们单位的精彩瞬间,让社会听见我们的声音。然而,理想与现实之间的距离,却在一次次邮箱投稿的石沉大海中渐渐清晰。那时的我,像所有“小白”一样,以为只要用心撰写稿件,通过电子邮件发给各大媒体,就能收获满…...

gRPC - Protocol Buffer 编译器安装

文章目录 Protocol Buffer 编译器安装如何安装 Protocol Buffer 编译器使用包管理器安装Linux 上&#xff0c;使用 apt 或 apt-get&#xff0c;例如&#xff1a;macOS 上&#xff0c;使用 Homebrew&#xff1a; 安装预编译的二进制文件&#xff08;任何操作系统&#xff09;其他…...

【Linux】centos7下载安装Python3.10,下载安装openssl1.1.1

目录 centos7下载安装Python&#xff08;版本3.10.14&#xff09; &#xff08;1&#xff09;网页下载python压缩包&#xff0c;并解压缩 &#xff08;2&#xff09;编译安装 Python在make altinstall时&#xff0c;报错及解决 &#xff08;3&#xff09;将安装目录和可执…...

通过 python 操作mongodb

库引入 Python 要连接 MongoDB 需要 MongoDB 驱动&#xff0c;这里我们使用 PyMongo 驱动来连接。 import pymongo 链接数据库 创建数据库需要使用 MongoClient 对象&#xff0c;并且指定连接的ip和端口号。 myclientpymongo.MongoClient("localhost",27017)#连接…...

若依框架对于后端返回异常后怎么处理?

1、后端返回自定义异常serviceException 2、触发该异常后返回json数据 因为若依对请求和响应都封装了&#xff0c;所以根据返回值response获取不到Code值但若依提供了一个catch方法用来捕获返回异常的数据 3、处理的方法...

vs code怎么补全路径,怎么快捷输入文件路径

安装插件&#xff1a; 链接&#xff1a;https://marketplace.visualstudio.com/items?itemNamejakob101.RelativePath 使用 按住 Ctrl Shift H&#xff0c;弹出窗口&#xff0c;输入文件补全&#xff0c;回车就可以了 排除文件 如果你的项目下文件太多&#xff0c;它会…...

git分支开发主干合并流程

文章目录 一、分支开发二、主干合并三、删除合并过的分支 一、分支开发 创建分支git branch <分支名> # git branch my_new_branch开发后提交代码git commit -m 本次开发内容 # git commit -m 增加登录保持功能同步远端仓库git push origin <分支名> # git push o…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...