C++中的一些困惑(长期更新中)

C++中的一些困惑

文章目录

  • C++中的一些困惑
    • 1. using std::具体命名与using namespace std;
    • 2. 【int \*p[10] 】与 【int (\*p)[10]】
    • 3. main()函数可带参,参从何来?
    • 4. constexpr函数的返回值可不为常量,那这时constexpr关键字作用是什么?
    • 5.为什么C++ STL不提供任何“树”容器?
    • 6. 函数参数后面的`const`

这是个人笔记,记录一些学习过程中没有理解以及容易混淆的问题与解答

1. using std::具体命名与using namespace std;

在C++中,使用 usingusing namespace 都是用来简化代码中命名空间的写法,但它们有不同的影响和使用场景,各有优劣:

  1. using std::具体命名
    • 优势:精确导入了命名空间中的特定名称,可以避免命名冲突,提高代码的可读性和可维护性。
    • 劣势:需要逐个导入每个需要使用的名称,可能会显得冗长,尤其是当需要导入多个名称时。
cppCopy codeusing std::vector;
using std::cout;
using std::endl;int main() {vector<int> nums = {1, 2, 3};cout << "Hello, world!" << endl;return 0;
}
  1. using namespace std;
    • 优势:一次性导入了整个 std 命名空间中的所有名称,可以方便地使用标准库中的各种功能,节省了代码中重复写命名空间的时间和空间。
    • 劣势:可能会引入命名冲突,尤其是当在代码中使用了其他命名空间或自定义了相同名称的变量或函数时,容易导致代码混乱和不可预测的行为。
cppCopy codeusing namespace std;int main() {vector<int> nums = {1, 2, 3};cout << "Hello, world!" << endl;return 0;
}

总体来说:推荐使用 using std::具体的类型 的方式来导入特定的名称,因为它可以明确指定要导入的内容,避免了潜在的命名冲突问题,同时保持了代码的清晰性和可维护性。而在大型项目或者有多个命名空间交叉的情况下,最好避免使用 using namespace std; 这样的全局命名空间导入方式,以免引起不必要的麻烦。

2. 【int *p[10] 】与 【int (*p)[10]】

  1. int *p[10]
    • 这表示 p 是一个数组,包含了 10 个元素。
    • 每个元素都是一个指向 int 类型的指针。
    • 可以直接通过索引来访问数组中的指针,如 p[0] 表示数组的第一个指针。
int *p[10];  // p 是一个数组,包含了 10 个指向 int 的指针
  1. int (*p)[10]
    • 这表示 p 是一个指针,指向一个包含 10 个整数的数组。
    • p 指向的整个数组是一个单独的对象,而不是一个指向指针的数组。
    • 需要通过解引用来访问指针指向的数组元素,如 (*p)[0] 表示指针 p 所指向数组的第一个元素。
int (*p)[10];  // p 是一个指针,指向一个包含 10 个整数的数组

举个例子来比较两者的使用:

int main() {int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int *p1[10];  // 数组,包含 10 个指向 int 的指针p1[0] = arr;  // 将数组 arr 的首地址赋给 p1 的第一个指针int (*p2)[10];  // 指针,指向包含 10 个整数的数组p2 = &arr;  // 将数组 arr 的地址赋给 p2// 使用 p1 访问数组元素for (int i = 0; i < 10; ++i) {std::cout << *(p1[0] + i) << " ";  // 输出数组元素}std::cout << std::endl;// 使用 p2 访问数组元素for (int i = 0; i < 10; ++i) {std::cout << (*p2)[i] << " ";  // 输出数组元素}return 0;
}

在上面的例子中,p1 是一个数组,包含了 10 个指向 int 的指针,而 p2 是一个指针,指向一个包含 10 个整数的数组。这两者的使用方式略有不同,因为 p1 中的每个元素都是指针,而 p2 指向的是整个数组对象。

3. main()函数可带参,参从何来?

在 C++ 中,main 函数可以具有带参数的形式,这些参数通常用于接收命令行参数。这些参数是由操作系统在程序启动时传递给程序的,并且可以在 main 函数的参数列表中接收到。

标准的 main 函数的声明有两种形式:

int main()

或者

int main(int argc, char* argv[])

第一种形式是不带参数的,程序启动时不会接收任何命令行参数。第二种形式是带参数的,其中 argc 表示命令行参数的数量,argv 是一个指向字符指针数组的指针,每个指针指向一个命令行参数的字符串。

  • argc(argument count)表示命令行参数的数量,包括程序名称在内。
  • argv(argument vector)是一个指针数组,每个元素指向一个命令行参数的字符串,其中 argv[0] 通常是程序的名称,argv[1]argv[2] 等依次是传递给程序的其他命令行参数。

例如,以下是一个简单的示例:

#include <iostream>
#include <string>// 编写一个带实参的main函数并运行
int main(int argc, char* argv[]) {// 确保有足够的实参if (argc != 3) {std::cerr << "Usage: " << argv[0] << " <arg1> <arg2>" << std::endl;return 1;  // 返回非零值表示错误退出}// 将实参连接成一个字符串std::string result = std::string(argv[1]) + " " + std::string(argv[2]);// 输出连接后的字符串std::cout << "Concatenated string: " << result << std::endl;return 0;
}

在VS code中编译运行:

  1. 打开Terminal,使用命令行编译源文件

    g++ -o  生成的程序名(如:myprogram)  源文件.cpp
    
  2. 编译器会生成一个名为myprogram的可执行文件

  3. 在终端运行程序并传参

    ./myprogram hello world
    

执行过程及结果:

image-20240313204143778

4. constexpr函数的返回值可不为常量,那这时constexpr关键字作用是什么?

虽然constexpr函数的返回值并非总是常量,但使用constexpr关键字可以告诉编译器,希望在可能的情况下在编译期间进行求值和优化。这样可以使代码更加灵活并提高性能,特别是在一些需要进行编译期间计算的场景下,constexpr函数非常有用。

进一步解释:

  • 某些场景下,函数的返回值仍然可以再编译期间确定。(通常是因为函数的输入参数是常量表达式,或者函数内部只包含了可以在编译期间计算的操作),如:
#include <iostream>// constexpr函数,参数是常量表达式
constexpr int add(int a, int b) {return a + b;
}int main() {// 在编译期间就可以计算出结果// 因为输入参数是常量表达式 constexpr int result = add(10, 20);std::cout << "Result: " << result << std::endl;return 0;
}

5.为什么C++ STL不提供任何“树”容器?

一个讨论:https://www.codenong.com/205945/

6. 函数参数后面的const

void func() const {};

是常量成员函数,即在函数内部不会修改对象的成员变量。
endl;
return 0;
}


## 5.为什么C++ STL不提供任何“树”容器?一个讨论:https://www.codenong.com/205945/## 6. 函数参数后面的`const````cpp
void func() const {};

是常量成员函数,即在函数内部不会修改对象的成员变量。

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

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

相关文章

CTF Show MISC做题笔记

MISCX 30 题目压缩包为misc2.rar,其中包含三个文件:misc1.zip, flag.txt, hint.txt。其中后两个文件是加密的。 先解压出misc1.zip, 发现其中包含两个文件&#xff1a;misc.png和music.doc。其中后面文件是加密的。 解压出misc.png,发现图片尾部有消息&#xff1a;flag{flag…

一个简单的消息队列

目录 原理 实现代码 示例 原理 消息队列是一个先进先出栈&#xff0c;每次都处理第一项&#xff0c;处理完了过后会删除这个消息&#xff0c;这是一个简单的消息队列图&#xff1a; 实现代码 首先消息队列需要一个队列&#xff0c;我们用Python里的列表&#xff1a; self.…

Shell脚本学习_内置命令

目录 1.内置命令介绍&#xff1a; 2.Shell内置命令&#xff1a;alias设置别名 3.Shell内置命令&#xff1a;echo输出字符串 4.Shell内置命令&#xff1a;read读取控制台输入 5.Shell内置命令&#xff1a;exit退出 6.Shell内置命令&#xff1a;declare设置变量 1.内置命令…

【计算机毕业设计】283基于微信小程序校园订餐

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

用python编撰一个电脑清理程序

自制一个电脑清理程序&#xff0c;有啥用呢&#xff1f;在电脑不装有清理软件的时候&#xff0c;可以解决自己电脑内存不足的情况。 1、设想需要删除指定文件夹中的临时文件和缓存文件。以下是代码。 import os import shutil def clean_folder(folder_path): for root,…

【备战蓝桥杯】蓝桥杯省一笔记:算法模板笔记(Java)

蓝桥杯 0、快读快写模板1、回文判定2、前缀和3、差分4、二分查找5、快速幂6、判断素数7、gcd&lcm8、进制转换9、位运算10、字符串常用API11、n的所有质因子12、n的质因子个数13、n的约数个数14、n阶乘的约数个数15、n的约数和16、阶乘 & 双阶乘17、自定义升序降序18、动…

Java----抽象类和接口

欢迎大家来这次博客-----抽象类和接口。 1.抽象类 1.1 抽象类概念 在Java中我们都是通过类来描述对象&#xff0c;但反过来并不是所有的类都是用来描述对象的。当一个类中没有足够的信息来描述一个具体对象&#xff0c;我们就将该类称为抽象类。 如上图中的Shape类&#xff…

Wireshark自定义Lua插件

背景&#xff1a; 常见的抓包工具有tcpdump和wireshark&#xff0c;二者可基于网卡进行抓包&#xff1a;tcpdump用于Linux环境抓包&#xff0c;而wireshark用于windows环境。抓包后需借助包分析工具对数据进行解析&#xff0c;将不可读的二进制数转换为可读的数据结构。 wires…

SwiftUI五视图动画和转场

代码下载 使用SwiftUI可以把视图状态的改变转成动画过程&#xff0c;SwiftUI会处理所有复杂的动画细节。在这篇中&#xff0c;会给跟踪用户徒步的图表视图添加动画&#xff0c;使用animation(_:)修改器给一个视图添加动画效果非常容易。 下载起步项目并跟着本篇教程一步步实践…

单元测试覆盖率

什么是单元测试覆盖率 关于其定义&#xff0c;先来看一下维基百科上的一段描述&#xff1a; 代码覆盖&#xff08;Code coverage&#xff09;是软件测试中的一种度量&#xff0c;描述程序中源代码被测试的比例和程度&#xff0c;所得比例称为代码覆盖率。 简单来理解&#xff…

【Redis学习笔记05】Jedis客户端(中)

Jedis客户端 1. 命令 1.1 String类型 1.1.1 常见命令 SET命令 语法&#xff1a;SET key value [EX seconds | PX milliseconds] [NX|XX] 说明&#xff1a;将string类型的value值设置到指定key中&#xff0c;如果之前该key存在&#xff0c;则会覆盖原先的值&#xff0c;原先…

短剧看剧系统投流版系统搭建,前端uni-app

目录 前言&#xff1a; 一、短剧看剧系统常规款短剧系统和投流版的区别&#xff1f; 二、后端体系 1.管理端&#xff1a; 2.代理投流端 三、功能区别 总结&#xff1a; 前言&#xff1a; 23年上半年共上新微短剧481部&#xff0c;相较于2022年全年上新的454部&#xff0…

C语言王国——数据的内存管理

目录 一、引言 二、整形在内存中的存储 2.1 进制之间的转换 2.1.1 整形的二进制 2.1.2 十进制和二进制 2.1.3 十进制和八进制的转换 2.1.4 十六进制和十进制的转换 2.2 原码&#xff0c;反码&#xff0c;和补码 三、大、小端字节序 3.1 大小端的定义 3.2 为什么会有大…

高考后志愿填报信息采集系统制作指南

在高考的硝烟散去之后&#xff0c;每位学生都面临着一个重要的任务——志愿填报。老师们如何高效、准确地收集和整理这些信息&#xff0c;成为了一个棘手的问题。难道我们只能依赖传统的手工登记方式&#xff0c;忍受其繁琐和易错吗&#xff1f; 易查分是一个简单易用的在线工具…

容器中运行ping提示bash: ping: command not found【笔记】

容器中运行ping提示bash: ping: command not found 原因是容器中没有安装ping命令 在容器中安装ping命令&#xff0c;可以使用以下命令&#xff1a; 对于基于Debian/Ubuntu的容器&#xff0c;使用以下命令&#xff1a; apt-get update apt-get install -y iputils-ping对于基…

上位机图像处理和嵌入式模块部署(f407 mcu和其他mcu品类的选择)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多朋友读书的时候学的是stm32&#xff0c;工作中用的也是stm32。这本来问题不大&#xff0c;但是过去两三年的经历告诉我们&#xff0c;mcu的使用…

音频数据上的会话情感分析

情感分析&#xff0c;也被称为观点挖掘&#xff0c;是自然语言处理(NLP)中一个流行的任务,因为它有着广泛的工业应用。在专门将自然语言处理技术应用于文本数据的背景下,主要目标是训练出一个能够将给定文本分类到不同情感类别的模型。下图给出了情感分类器的高级概述。 例如,三…

牛客热题:最长公共子序列Ⅱ

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;最长公共子序列Ⅱ题目链接方法一…

网络安全形势与WAF技术分享

我一个朋友的网站&#xff0c;5月份时候被攻击了&#xff0c;然后他找我帮忙看看&#xff0c;我看他的网站、网上查资料&#xff0c;不看不知道&#xff0c;一看吓一跳&#xff0c;最近几年这网络安全形势真是不容乐观&#xff0c;在网上查了一下资料&#xff0c;1、中国信息通…

vue2的form利用插槽修改错误提示UI

1. 需求 很多时候我们使用el-form想修改下错误提示的UI&#xff0c;比如table中使用form校验这类场景下错误提示的UI调整就非常重要。 2. 了解文档 Form-Item Scoped Slot name说明error自定义表单校验信息的显示方式&#xff0c;参数为 { error } 3.实际使用 html里使用…