c++学习总结
zhangzhangkeji
这个作者很懒,什么都没留下…
展开
-
c++ 里类的静态成员函数与动态成员函数的区别
类的定义的成员函数,若加了 static 修饰,则该函数可以在没有创建类对象的情况下,直接被调用。若没有加 static 修饰的成员函数,只有在创建了类对象后,由对象调用。因为动态成员函数在编译后的第一个形参是 this ,对象的地址。而 加了 static 的成员函数是没有 this 形参的,在 static 函数里甚至不能使用 this 关键字。可见两种成员函数在编译上的区别。原创 2024-05-20 16:49:36 · 103 阅读 · 0 评论 -
c++ vs2019:用父类指针访问子类对象,如何访问子类中继承的但被改为私有的虚函数?
咱们都知道, c++ 里类的私有函数不能被外界访问。只能被类内别的函数访问。原创 2024-05-16 21:34:42 · 192 阅读 · 0 评论 -
vs2019 c++里用 typeid() . name () 与 typeid() . raw_name () 测试数据类型的区别
(1) 都知道,在 vs2019 里用 typeid 打印的类型不大准,会主动去掉一些修饰符, const 和引用 修饰符会被去掉。但也可以给咱们验证学到的代码知识提供一些参考。那么今天发现其还有 raw_name 成员函数,这个函数会打印的更全面么?原创 2024-05-15 22:28:25 · 194 阅读 · 0 评论 -
关于 vs2019 c++20 规范里的 STL 库里模板 decay_t<T>
(1) 这个模板,在库代码里非常常见。decay 英文是“衰弱,消减” 的意思,大概能感觉到就是要简化模板参数 T 的类型,去掉其上的修饰符。因为常用且复杂,故单独列出其源码和注释。原创 2024-05-15 19:59:32 · 152 阅读 · 0 评论 -
关于 vs2019 c++20 规范里的一个全局函数 _Test_callable
(1)看名思议,觉得这个函数可以测试其形参是否是可以被调用的函数,或可调用对象?不,这个名字不科学。有误导,故特别列出。可见任意指针类型,只要非空,都可以使本函数返回 true。可是很多指针指向的并非使可执行的程序。所以以后咱们要是单独使用此函数,不要被其名字迷惑了。原创 2024-05-15 18:53:06 · 130 阅读 · 0 评论 -
vs2019 c++中模板 enable_if_t 的使用
即某些条件满足时才可以调用类的该成员函数。若类里只有一个具有此名字的成员函数,且对其调用的条件不满足(没有给出合适的模板参数),结果是在编译阶段,代码就报错了。这就是使用 enable_if_t 的好处。当第一个模板参数为 true 时 , 名称 enable_if_t 才对应类型名 _Ty。进而可以用 enable_if_t 来定义变量。上例中的 A 只可以接受 char 类型的实参。看源码时,经常出现的情况是类的成员函数是模板函数,但对成员函数的模板参数的类型加以限制。原创 2024-05-15 06:56:39 · 175 阅读 · 0 评论 -
探讨 cs2019 c++ 的STL 库中的模板 conjunction 与 disjunction
可以得出结论: conj 是为了查找逻辑布尔型模板参数中的第一个 false;若模板参数全是 true 则返回 true。(1)在 STL 库源码中这俩模板经常出现,用来给源码编译中的条件选择,模板的版本选择等提供依据。disJ 是为了查找模板参数中的第一个 true;模板参数全为 false 才返回 false。原创 2024-05-14 18:35:23 · 133 阅读 · 0 评论 -
分析 vs2019 c++ 中的 decltype 与 declval
可见,能总结出 : declval 函数返回了对其模板参数的右值引用。当不能为模板参数的对象添加引用,则返回模板参数本身。(1) decltype 可以让推断其参数的类型。(3) 结合 std::declval 的定义,比较好掌握使用其的语法。原创 2024-05-14 18:03:22 · 161 阅读 · 0 评论 -
测试 vs2019 c++ 在 32 位系统和 64 位系统里的 sizeof ( void * )
再看下反汇编:接着给出 32 位系统的结果:原创 2024-05-14 16:34:28 · 206 阅读 · 0 评论 -
vs2019 c++静态断言 static_assert ()
(1) 静态断言,就是在编译时候,让编译器测试一下, static_assert( bool a , “字符串”) 的第一个参数,若 第一个参数为 true ,则表明程序可以被编译。否则,编译器拒绝编译。这是为了满足某些代码在语法语义方面的要求。原创 2024-05-14 14:52:56 · 183 阅读 · 0 评论 -
vs2019 c++ 对左值引用取地址得到的是谁的地址?
(2) 用反汇编看一下,为了代码容易看懂,改一下源代码,不使用 cout 这个复杂的对象;对左值引用取地址,返回的地址是其引用的变量的地址,而非自身的地址。原创 2024-05-14 00:08:24 · 142 阅读 · 0 评论 -
vs2019 cpp20 规范的线程头文件 <thread> 注释并探讨几个问题(上)
接着在这一行代码里构建元组,并用实参对其初始化,并用独占智能指针指向这个新创建的 tuple 元组,其实这个元组就是将来线程执行时 的形参值,这些也作为函数中的局部变量的形参在内存中的位置。所以可以得出结论,线程中的函数,其形参是独一无二的,与 main 函数中创建线程时传递的实参没有任何关系。显然,函数形参的生存周期可能很长,是伴随线程存在,伴随其函数存在的。所以可见,在 thread 中构建的 tuple 元组,将只包含最基本的不含引用 ,const ,volatile 等修饰符的类型。原创 2024-05-12 22:56:51 · 457 阅读 · 0 评论 -
探讨 vs2019 c++ 里函数指针与函数类型在使用上的语法区别
(1)咱们可以用 decltype () 来判断函数的类型。但以这个类型定义有用的可指向已存在函数的变量,却行不通。所以函数类型只有语法意义。但在使用上没有函数指针有用。例如上面的 Fun 类型,没有构造函数等成员函数,啥用没有。原创 2024-05-11 19:39:46 · 175 阅读 · 0 评论 -
vs2019 STL库里 判断函数类型的模板 is_function_v 与 is_const_v
经简单代码测试后,得出 vs2019 的 c++ 编译器 和 其 STL 库的观点与设计:is_const_v 用来判断类型 T 内是否含有 const 修饰符,含有 const 则返回真。,可以被 is_function_v 用来筛选函数类型。给函数类型加上 const 修饰,感觉语义上无法理解,但编译并不报错。所以 STL 库对函数类型的筛选不是通过定义,是通过间接的排除法。原创 2024-05-11 19:07:22 · 202 阅读 · 0 评论 -
关于 vs2019 c++ 20规范,STL 库提供的标准分配器 alloctor 及其 traits 及涉及分配器交换的全局函数 _Pocs
对于两个 list 链表,使用的默认的分配器将都是 STL 中的类, allocator。意思是不支持对象交换。相当于 两个 list 对象交换时不必交换分配器,因为它们使用的是相同的分配器。(1) 我们写 c++ 代码,使用 STL 库中的模板,很少自己写对象的分配器。研究 STL 中的分配器也可以为咱们自己写分配器提供参考。咱们会遇到这样的场景,例如交换两个容器对象: list a ,b;其中使用了全局函数 _Pocs ,其进行俩 list 对象的分配器的交换。可见,跟咱们的预想是一致的。原创 2024-05-10 03:17:48 · 312 阅读 · 0 评论 -
分析 vs2019 c++20 语法规范下的全局函数: _Pocca ,这涉及到分配器的传递
原因是形参 1 和 2 都是由 STL 的分配器 allocator 实例化的。彼此一模一样,不必再复制。从此源码得出结论,如果不自己写分配器,使用 STL 提供的标准分配器。那么由上图可知, 函数 _Pocca 中的 if 语句将不会得到执行。可见咱们的猜测是对的。原创 2024-05-09 03:38:53 · 183 阅读 · 0 评论 -
关于 c++ 中字符串 string 及 常量字符串的换行与使用
(1)例如 cout << " ddddddddddddddddddd"。当输出字符太长,就需要换行。疑问是如何写代码,才可以保证源代码中的字符串换行被正确编译呢?测试一下,如下图可见,如此换行,源代码中的字符串可以被正确编译。原创 2024-05-08 16:47:14 · 196 阅读 · 0 评论 -
关于vs2019 c++ STL 中容器的迭代器的 -> 运算符的使用,以 list 双向链表为例
对于 STL 中提供的迭代器,提供了类似于指针的功能。对迭代器也可以使用 -> 运算符来访问容器中元素对象里的成员。可见 ,pointer_to 只是解析了其形参的内存地址。对于全局函数 addressof 就不再展开了,见名知意,就是求形参的地址。(1)如下的结构体 A ,若有指针 p = new A();则可以使用 p->m , p->n 解引用运算符。这也符合我们对指针的理解。只要通过指针拿到了对象的首地址,就可以用偏移量来访问类对象中的各个数据成员和函数。原创 2024-05-08 04:39:47 · 270 阅读 · 0 评论 -
关于c++ 中 string s { ‘a‘ , ‘b‘ , ‘c‘ , ‘d‘ } 的方式的构造过程
(1)这样的构造方式不常见,但也确实 STL 库提供了这样的构造函数。(2)以反汇编分析这行代码。原创 2024-05-07 23:30:56 · 192 阅读 · 0 评论 -
关于 c++的模板库中的数组模板 is_array_v的测试
如图,对于变量名 b ,使用 b 代表使用 b 中的值, 使用 &b 代表使用变量 b 的地址。对于数组名 a 而言,使用名称 a 代表使用 数组的起始地址,使用 &a 也是使用 数组的 起始地址。在监视窗口,c++ 编译器也是如此处理的。但 图中代码上还是有不同的效果。这里涉及了 c/c++ 里类型的语法定义:类型 B 视为数组,存储了三个 char 指针。类型 C 视为指针类型,指向具有三个 char 元素的数组。但可见 c++ 编译器,依然如咱们学习的知识:把数组名处理成了数组起始地址。原创 2024-05-05 15:32:13 · 202 阅读 · 0 评论 -
c/c++里 对 共用体 union 的内存分配
对union 的内存分配,是按照最大的那个成员分配的。原创 2023-09-26 16:55:14 · 379 阅读 · 0 评论 -
c++ reference_wrapper源码注释
并给出图片,这样就不用下载了。原创 2023-09-19 01:04:19 · 104 阅读 · 0 评论 -
c++ bind函数的神奇用法示例
原创 2023-09-18 22:39:38 · 31 阅读 · 0 评论 -
c++借助boost库的资源测试对象类型的代码示例
【代码】c++借助boost库的资源测试对象类型的代码示例。原创 2023-09-18 16:29:25 · 39 阅读 · 0 评论 -
c++类方法里的特殊成员方法
如上图,在模板类里有很相似的两个方法。第二个方法的函数名后面多了一个const 修饰,意思是对于该类型 的常量对象,采用此特殊的常量方法。可见的是,返回值是常量迭代器,不会经此迭代器修改它的容器对象。原创 2023-09-18 16:06:04 · 36 阅读 · 0 评论 -
c++ decltype()的两个特殊情况
提供了这么违反感觉的语法,可能是为了语法完备性,但不直观。原创 2023-09-18 13:20:13 · 53 阅读 · 0 评论 -
c++ 函数的参数是否可以为auto
(1)在vs2019开到 cpp20 的语法规范,是可以的。(2)但网上和文心一言和书上说不可以。原创 2023-09-17 22:10:19 · 231 阅读 · 0 评论 -
c++ 对象的显式初始化与隐式初始化
原创 2023-09-17 18:48:21 · 82 阅读 · 0 评论 -
c++的库函数std::move() 与 完美转发函数 std:: forward 源码
以下是两个注释:原创 2023-09-17 14:19:28 · 84 阅读 · 0 评论 -
【无标题】c++ 中,实参是数组,传递给形参,如何在形参中获得数组长度
如图,通过如此诡异的写法,在模板函数类型推断中,会得出数组长度,并且这么定义形参,还可以拿到数组长度。c++的编译器很牛,很诡异。原创 2023-09-17 00:45:01 · 56 阅读 · 0 评论 -
c++ vs2019 cpp20规范 模板function 源码解析
【代码】c++ vs2019 cpp20规范 模板function 源码解析。原创 2023-09-16 01:57:46 · 151 阅读 · 0 评论 -
c++ 基础类 type_info 的源码,精简版,cpp20规范
代码太长了,分两个框。原创 2023-09-15 18:34:09 · 63 阅读 · 0 评论 -
__declspec(novtable) 在C++
因此, __declspec(novtable)一般是应用于接口(其实就是包含纯虚函数的类), 因为接口包含的都是纯虚函数, 不可能生成实例. 我们把 __declspec(novtable)应用到接口类中, 这些接口类就不用包含虚函数表和初始化虚函数表的代码了. 它的派生类会自己包含自己的虚函数表和初始化代码.原创 2023-09-14 23:00:55 · 271 阅读 · 0 评论 -
c++ 中的函数指针
以下图片演示了c++中函数指针的用法。原创 2023-09-14 19:43:31 · 359 阅读 · 0 评论 -
c++ bind函数源码分析
该函数,可以绑定别的函数的一个参数,给其先行确定一个值。经过大概的源码分析,但不具体。貌似是里面用了指针,来保存一些值。可能原理是编译时候,先保存了一个值在exe文件,通过指针,可以提取到该数据。从而实现预先绑定的效果。原创 2023-09-14 18:37:49 · 34 阅读 · 0 评论 -
测试 c++ 之 is_function_v
在 C++ 中,std::is_function_v 是一个类型特征(type trait),用于检查给定的类型是否为函数类型。它是 C++17 中引入的一个模板元函数,返回一个布尔值,表示给定的类型是否为函数类型。如图,给 is_function_v 传入一个类,为假,传入一个函数对象则为真。原创 2023-09-14 16:03:24 · 225 阅读 · 0 评论 -
vs2019 STL库中的 c++ 全局函数的源码
【代码】vs2019 STL库中的 c++ 全局函数的源码。原创 2023-09-13 00:44:07 · 79 阅读 · 0 评论 -
c++的类模板里,可以直接为静态变量赋值么?
一直以来,咱们学的是,给类模板里的静态变量赋值,要在类外面。但对于类常量,则可以直接在定义时赋值。起因是看STL源码时有这么的写法,又验证了一下。但是在类模板里直接定义静态活动变量是不可以的,即去掉const。原创 2023-09-08 13:20:46 · 139 阅读 · 0 评论 -
vs2019 ,c++的STD库全局函数 _Pocma 与 _Swap_adl 的思考
根据 c++ 语法。这非常神奇,也验证了咱们一丝不苟的治学精神,和融会贯通的学习方法,和我们王建伟老师的伟大教学功绩。王老师教的好,才有咱们学的好。在函数_Move_assign 中,实参是对两个分配器的引用,咱们c++ 里,STL 提供了一个标准分配器,就是allocator模板类。(1)在阅读vs2019上的 STL库的 map 源码时,遇到了这个函数,之前,在别的源码中也经常出现这个函数。(3)allocator模板类的定义如下图,这里对模板类中一些不重要的函数修饰符去掉了,以突出重点,方便阅读。原创 2023-08-27 01:13:09 · 241 阅读 · 0 评论 -
c++,标准库std中全局函数 _Destroy_in_place(...)的分析
可见,当形参类型是指针时,该函数什么也没做。或者说指针类型是c++内置类型,c++编译器给指针类型规定的构造和析构函数中,就是没有任何代码,空函数体的。这个奇怪现象,有别于真正的数据类型。可见,传入形参为某种类型的引用,该函数会执行形参的析构函数,还可以有效解决数组的连续析构。可见,当该函数的形参是指针类型,没有析构和构造函数,该函数不执行具体的内容,什么也不做。(2)疑问是,若形参是指针类型,该函数怎么执行,指针类型是没有析构函数的。如此,就解开了对指针应用该函数的疑惑,相当于什么也没做。原创 2023-08-25 01:36:10 · 233 阅读 · 0 评论