C++中的琐碎知识点

ops/2025/1/17 12:54:43/

指针、常量和类型别名

1.使用 typedef char *pstring; const pstring cats = 0; 时:

  • 首先,typedef char *pstring; 定义了 pstring 是 char * 的别名,即 pstring 表示一个指向 char 的指针类型。
  • 然后,const pstring cats = 0; 意味着 cats 是一个 pstring 类型的常量,即 cats 是一个指针,这个指针本身是常量,不允许修改 cats 指针的值,使其指向其他地方,但可以通过 cats 指针修改它所指向的字符内容。例如:
  • #include <iostream>
    typedef char *pstring;
    int main() {const pstring cats = 0;char str[] = "hello";// 错误:cats 是常量指针,不能修改其指向// cats = str; // 正确:可以修改 cats 指向的内容if (cats!= 0) {*cats = 'H'; }return 0;
    }

  • 这里,如果尝试修改 cats 指针的值(如 cats = str;),编译器会报错,因为 cats 是一个常量指针,但如果 cats 不为 NULL,可以修改 cats 所指向的内容(如 *cats = 'H';)。

 2.当我们使用 const char *cats = 0; 时:

    • 这里 cats 是一个指向 const char 的指针,意味着 cats 可以指向不同的位置,但不能通过 cats 指针修改它所指向的字符内容。例如:
#include <iostream>
int main() {const char *cats = 0;char str[] = "hello";// 正确:可以修改 cats 的指向cats = str; // 错误:不能修改 cats 所指向的内容if (cats!= 0) {// *cats = 'H'; }return 0;
}
  • 这里可以将 cats 指针指向不同的字符串(如 cats = str;),但如果尝试修改 cats 所指向的内容(如 *cats = 'H';),编译器会报错,因为 cats 指向的是 const char,其指向的内容是不允许修改的。

总结

  • typedef char *pstring; const pstring cats = 0; 中 cats 是一个常量指针,其指向可以修改,但不能修改 cats 本身的值。
  • const char *cats = 0; 中 cats 是一个指向常量的指针,其指向可以修改,但不能修改其指向的内容。

 3.对 const pstring *ps; 的解释

  1. 首先回顾 typedef char *pstring;,这里 pstring 是 char * 的别名,即 pstring 表示一个指向 char 的指针类型。
  2. 对于 const pstring *ps;
    • ps 是一个指针,这个指针指向的是 pstring 类型的数据。
    • 由于 pstring 本身是 char * 的别名,所以 ps 实际上是一个指针,它指向的是一个指向 char 的指针。
    • 关键在于 const 的位置,这里 const 修饰的是 pstring,即 ps 所指向的 pstring 类型的数据是常量。
    • 具体来说,这意味着 *ps 是一个 pstring 类型的常量,也就是 *ps 是一个指向 char 的指针,且这个指针是常量。不能通过 ps 修改它所指向的 pstring 指针的值。
#include <iostream>
typedef char *pstring;
int main() {char str1[] = "hello";char str2[] = "world";pstring p1 = str1;pstring p2 = str2;const pstring *ps = &p1;// 错误:*ps 是常量指针,不能修改其指向// (*ps) = p2; return 0;
}

总结

  • const pstring *ps; 中 ps 是一个指针,它指向的是一个指向 char 的指针(pstring),并且 *ps 所指向的 pstring 指针是常量,不能通过 ps 来修改它所指向的 pstring 指针的值。

c++11中constexpr、auto、decltype

constexpr

  • 用途:用于在编译期计算表达式的值。这意味着可以用它来创建常量表达式,提高程序性能。例如,可以用constexpr定义常量和常量函数。

 

constexpr int square(int x) {return x * x;
}
constexpr int num = square(5); // num的值在编译期就确定为25
  • 注意点constexpr函数必须足够简单,其内部只能包含少量的操作,如算术运算、类型转换等,并且不能有副作用(如修改全局变量)。

 

auto

  • 用途:让编译器自动推导变量的类型。这样可以减少代码编写的繁琐程度,特别是在处理复杂的类型,如迭代器、模板类型等。

 

std::vector<int> v = {1, 2, 3};
auto it = v.begin(); // it的类型被自动推导为std::vector<int>::iterator
  • 注意点auto会根据初始化表达式尽可能地推导出合适的类型,但有时候推导出来的类型可能不是你期望的,比如引用折叠等情况需要注意。

 decltype

  • 用途:用于查询表达式的类型。这在编写模板代码或者需要根据已有变量类型来定义新变量时非常有用。
int a = 10;
decltype(a) b = 20; // b的类型和a一样,是int
  • 注意点decltype在处理一些复杂的表达式(如函数调用、带有括号的表达式等)时,推导规则比较复杂,需要特别注意其推导出来的类型是否符合预期。

 decltypeauto在 C++ 11 中有一些相同点和不同点

 

相同点

  • 类型推导目的decltypeauto都是用于类型推导的工具。它们在一定程度上都能帮助程序员减少代码中冗长的类型声明,使代码更加简洁。例如,在处理复杂的模板类型或者迭代器类型时,它们都可以用来避免手动书写复杂的类型。

不同点

  • 推导时机和方式
    • autoauto是根据变量的初始化表达式来推导类型,它主要关注的是变量初始化的值。例如,auto x = 5;,这里auto会根据5这个整数值推导xint类型。而且auto在推导时通常会忽略顶层const和引用(除非初始化表达式本身就是引用类型)。比如const int a = 10; auto b = a;b的类型是int,而不是const int
    • decltypedecltype是根据表达式本身的类型来推导,而不考虑表达式是否初始化或者初始化的值是什么。例如,int a = 10; decltype(a) b;,这里b的类型就是int,和a的类型一样。decltype在推导时会完整地保留类型的所有属性,包括const、引用等。例如,const int& c = a; decltype(c) d;d的类型是const int&
  • 使用场景
    • auto:通常用于声明变量时,自动获取变量的类型,尤其是在迭代器遍历容器、lambda 表达式捕获变量等场景下非常方便。比如,for (auto it = container.begin(); it!= container.end(); ++it)auto可以自动推导迭代器的类型。
    • decltype:更多地用于在需要获取某个表达式的确切类型来声明其他变量或者函数返回类型等情况。例如,在模板编程中,当你想根据一个模板参数的表达式类型来定义另一个变量类型时,decltype就很有用。比如,template<typename T> void func(T& t) { decltype(t) another_variable; }

http://www.ppmy.cn/ops/150805.html

相关文章

c#-Halcon入门教程——标定

Halcon代码 read_image (NinePointCalibration, D:/Desktop/halcon/ca74d-main/九点标定/NinePointCalibration.gif)rgb1_to_gray (NinePointCalibration, GrayImage)get_image_size (GrayImage, Width, Height) dev_display (GrayImage)* 获取当前显示的窗口句柄 dev_get_win…

Azure 100 学生订阅下,使用 Docker 在 Ubuntu VPS 上部署 Misskey 的详细教程

什么是 Docker 和 Misskey&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;它可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;包括物理机、虚拟机、云服务等。使用 Docker&#xff0c…

Lora综述:全面系统的理解lora微调

基础模型的快速发展已经彻底改变了人工智能领域&#xff0c;其在自然语言处理&#xff0c;计算机视觉和科学发现等领域取得了前所未有的进步。然而&#xff0c;这些模型的大量参数&#xff08;通常达到数十亿或数万亿&#xff09;使其在适应特定下游任务方面构成了重大挑战。 …

43.Textbox的数据绑定 C#例子 WPF例子

固定最简步骤&#xff0c;包括 XAML&#xff1a; 题头里引入命名空间 标题下面引入类 box和block绑定属性 C#&#xff1a; 通知的类&#xff0c;及对应固定的任务 引入字段 引入属性 属性双触发&#xff0c;其中一个更新block的属性 block>指向box的属性 从Textbo…

物联网网关Web服务器--lighttpd服务器部署与应用测试

以下是在国产ARM处理器E2000飞腾派开发板上部署 lighttpd 并进行 CGI 应用开发的步骤&#xff1a; 1、lighttpd简介 Lighttpd 是一款轻量级的开源 Web 服务器软件&#xff0c;具有以下特点和功能&#xff1a; 特点 轻量级&#xff1a;Lighttpd 在设计上注重轻量级和高效性&a…

一种基于部分欺骗音频检测的基于临时深度伪造位置方法的高效嵌入

AN EFFICIENT TEMPORARY DEEPFAKE LOCATION APPROACH BASED EMBEDDINGS FOR PARTIALLY SPOOFED AUDIO DETECTION 摘要&#xff1a; 部分伪造音频检测是一项具有挑战性的任务&#xff0c;在于需要在帧级别上准确地定位音频的真实性。 时间性深度伪造定位( TDL )可有效地捕获特征…

网络层协议-----IP协议

目录 1.认识IP地址 2.IP地址的分类 3.子网划分 4.公网IP和私网IP 5.IP协议 6.如何解决IP地址不够用 1.认识IP地址 IP 地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址。 它是分配给连接到互联网的设备&#xff08;如计算机、服务器、智能手机…

太速科技-402-基于TMS320C6678+XC7K325T的高性能计算核心板

基于TMS320C6678XC7K325T的高性能计算核心板 一、板卡概述 本板卡系我公司自主研发&#xff0c;采用一片TI DSP TMS320C6678和一片Xilinx公司K7系列FPGA XC7K325T-2FFG900-I作为主处理器&#xff0c;Xilinx 的Spartans XC3S200AN作为辅助处理器。其中XC3S200AN负责管理板…