【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;
}

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


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

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

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

相关文章

2024东北四省赛——M House

cf上有题解&#xff0c;我写这个只想说真服了&#xff0c;卡double了导致一直没做出来 开long double过的 贴一下我的代码 #include <bits/stdc.h>using namespace std; typedef long double LD; typedef long long LL; #define int LL #define double LD const int N …

【蓝桥杯】国赛普及-

题目列表 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) P9420 [蓝桥杯 2023 国 B] 子 2023 / 双子数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using llunsigned long long; #define int ll const int N2e510; int k0; std::string s; int…

【传知代码】无监督动画中关节动画的运动表示-论文复现

文章目录 概述动画技术的演进原理介绍核心逻辑环境配置/部署方式小结 本文涉及的源码可从无监督动画中关节动画的运动表示该文章下方附件获取 概述 该文探讨了动画在教育和娱乐中的作用&#xff0c;以及通过数据驱动方法简化动画制作的尝试。近期研究通过无监督运动转移减少对…

Java进阶学习笔记30——BigDecimal

BigDecimal&#xff1a; 用于解决浮点型运算的&#xff0c;出现结果失真的问题。 运行结果&#xff1a; package cn.ensource.d4_bigdecimal;import java.math.BigDecimal;public class Test {public static void main(String[] args) {// 目标&#xff1a;了解BigDecimal类do…

RustGUI学习(iced/iced_aw)之扩展小部件(二十七):如何使用number_input部件?

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 概述 这是本专栏的第二十七篇,主要讲述number_input部件的使用,会…

8、Qt—Log4Qt使用小记2(每日产生文件)

前言&#xff1a; 开发平台&#xff1a;Win10 64位 开发环境&#xff1a;Qt Creator 13.0.0 构建环境&#xff1a;Qt 5.15.2 MSVC2019 64位 例如&#xff1a;上一篇文章中笔者记录了Log4qt的编译及配置使用&#xff0c;这篇文章重点写下每天产生文件到指定文件夹中&#xff0c;…

5.1 Go 函数的定义与调用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Spring Boot集成testcontainers快速入门Demo

1.什么是testcontainers&#xff1f; Testcontainers 是一个用于创建临时 Docker 容器进行单元测试的 Java 库。当我们想要避免使用实际服务器进行测试时&#xff0c;它非常有用。&#xff0c;官网介绍称支持50多种组件。​ 应用场景 数据访问层集成测试&#xff1a; 使用My…

ubuntu20安装Labelme

conda create --namelabelme python3 进入conda环境 source activate labelme 安装labelme pip install labelme 遇到网络问题 使用清华源 pip install labelme -i https://pypi.tuna.tsinghua.edu.cn/simple/ 输入labelme 打开

Google的MLP-MIXer的复现(pytorch实现)

Google的MLP-MIXer的复现&#xff08;pytorch实现&#xff09; 该模型原论文实现用的jax框架实现&#xff0c;先贴出原论文的代码实现&#xff1a; # Copyright 2024 Google LLC. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may …

GEC210编译环境搭建

一、下载编译工具链 下载&#xff1a;点击跳转 二、解压到 /usr/local/arm 目录 sudo mv gec210.zip /usr/local/arm cd /usr/local/arm sudo unzip gec210.zip 三、添加到环境变量 PATH/usr/local/arm/arm-cortex_a8-linux-gnueabi-4.7.3/bin:$PATH 四、测试验证 在终端…

python数据分析-基于数据挖掘对APP评分的预测

前言 当我们谈论关于APP用户分析与电子商务之间的联系时&#xff0c;机器学习在这两个领域的应用变得至关重要。App用户分析和电子商务之间存在着密切的关联&#xff0c;因为用户行为和偏好的深入理解对于提高用户体验、增加销售以及优化产品功能至关重要。故本文基于K-近邻模…

OFDM 802.11a的FPGA实现(二十)使用AXI-Stream FIFO进行跨时钟(含代码)

目录 1.前言 2.AXI-Stream FIFO时序 3.AXI-Stream FIFO配置信息 4.时钟控制模块MMCM 5.ModelSim仿真 6.总结 1.前言 至此&#xff0c;通过前面的文章讲解&#xff0c;对于OFDM 802.11a的发射基带的一个完整的PPDU帧的所有处理已经全部完成&#xff0c;其结构如下图所示&…

opencv-C++ VS2019配置安装

最新opencv-c安装及配置教程(VS2019 C & opencv4.4.0)_c opencv配置-CSDN博客

夜雨触花感怀

夜雨触花感怀 雨落有轨迹&#xff0c;业成无坦途。 ​鸡毛飞虚空&#xff0c;寻德问心路。 ​恰如求耕耘&#xff0c;大话量寸土。 ​好吃品五味&#xff0c;难得评真俗。

CAN总线简介

1. CAN总线概述 1.1 CAN定义与历史背景 CAN&#xff0c;全称为Controller Area Network&#xff0c;是一种基于消息广播的串行通信协议。它最初由德国Bosch公司在1983年为汽车行业开发&#xff0c;目的是实现汽车内部电子控制单元&#xff08;ECUs&#xff09;之间的可靠通信。…

用Vuex存储可配置下载的ip地址(用XML进行ajax请求配置文件)

1.在public文件夹下创建一个名为Configuration的文件在创建一个Configuration.txt里面就放IP地址&#xff08;这里的名字可以随便命名一定性的被人解读文件含义&#xff09; 例如&#xff1a; http://172.171.208.1:80032.在store文件夹中创建一个名为 ajaxModule.js 的 Vuex …

2. CSS选择器与伪类

2.1 基本选择器回顾 在开始介绍CSS3选择器之前&#xff0c;我们先回顾一下CSS的基本选择器。这些选择器是所有CSS开发的基础。 2.1.1 元素选择器 元素选择器用于选中指定类型的HTML元素。 /* 选中所有的<p>元素 */ p {color: blue; }2.1.2 类选择器 类选择器用于选中…

03自动辅助导航驾驶NOP其实就是NOA

蔚来NOP是什么意思&#xff1f;蔚来NOP是啥 蔚来NOP的意思就是NavigateonPilot智能辅助导航驾驶&#xff0c;也就是大家俗称的高阶辅助驾驶&#xff0c;在车主设定好导航路线&#xff0c;并且符合开启NOP条件的前提下&#xff0c;蔚来NOP可以代替驾驶员完成从A点到B点的智能辅助…

深入理解数仓开发(二)数据技术篇之数据同步

1、数据同步 数据同步我们之前在数仓当中使用了多种工具&#xff0c;比如使用 Flume 将日志文件从服务器采集到 Kafka&#xff0c;再通过 Flume 将 Kafka 中的数据采集到 HDFS。使用 MaxWell 实时监听 MySQL 的 binlog 日志&#xff0c;并将采集到的变更日志&#xff08;json 格…