![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++学习总结
zhangzhangkeji
这个作者很懒,什么都没留下…
展开
-
c++ 里如何检测内存泄露:比如用了 new ,但没有用 delete
(1 方法一) 用 MFC 框架的 F5 不带断点的调试。可以在输出窗口提示是否有内存泄露。原创 2024-07-05 19:02:14 · 489 阅读 · 0 评论 -
c++ 附赠课程的知识点记录
(1) 静态变量的赋值。原创 2024-07-05 15:37:37 · 286 阅读 · 0 评论 -
c++ 动态类型转换 dynamic_cast<> 的验证
谢谢原创 2024-07-04 16:47:19 · 293 阅读 · 0 评论 -
c++ 设计模式 的课本范例(下)
(19) 桥接模式 Bridge,不是采用类继承,而是采用类组合,一个类的数据成员是类对象,来扩展类的功能。原创 2024-07-01 00:28:54 · 275 阅读 · 0 评论 -
c++ 设计模式 的课本范例(中)
(10)原创 2024-06-25 18:20:03 · 284 阅读 · 1 评论 -
c++ 语法中的 for 循环, while 循环 ,循环体中的 变量创建会每次都执行么? 是的
原创 2024-06-23 19:31:40 · 89 阅读 · 0 评论 -
c++ 中如何往 string 字符串类型里插入浮点数
谢谢,在看王老师课程时,有如此用法,单独拿出来记录一下原创 2024-06-23 13:42:04 · 147 阅读 · 0 评论 -
c++ 里构造函数的形参与数据成员的同名问题
如题,这时,或许在 java 里,会报语法错误。但在 c++ vs2019 开了 c++20语法规范。这样的好处是解决了咱们的起变量名的麻烦:重名现在已不是错误,编译器可以解决了。原创 2024-06-21 22:57:02 · 268 阅读 · 0 评论 -
c++ 设计模式 的课本范例(上)
(2)简单工厂模式:不要直接使用 new A() 创建对象,一旦对类 A 增删和修改参数,会紧耦合,牵一发动全身,用一个函数集中使用 new A ,返回创建好的对象,如同工厂批量生产产品一样。对构造对象时 的修改也限制在工厂方法里。(1) 框架设计模式 model mode : 算法的框架不变,算法的细节可以改变。原创 2024-06-21 13:19:53 · 255 阅读 · 0 评论 -
c++里 父类私有的虚函数,也是可以被子类重写和继承的。但父类私有的普通函数,子类无法直接使用
今天看课本上有这么个用法,特测试一下。这样就也可以放心的把父类的私有函数列为虚函数了,或者说把父类的虚函数作为私有函数了。原创 2024-06-20 20:45:49 · 264 阅读 · 0 评论 -
c++里 lamda 表达式,其实被编译器处理为匿名类,并实例化为匿名对象
lamda 表达式必须在函数作用域中定义。通过按值捕获或按引用捕获,可以使用所在函数中定义的变量。在类的成员函数中定义的 lamda 表达式,若捕获了 this ,则可以修改或读取类里的数据成员。lamda 表达式可以不用捕获,直接使用所在函数中定义的静态变量。该匿名对象定义了括号 () 运算符函数,所以可以像函数一样被调用。原创 2024-06-18 21:33:47 · 271 阅读 · 0 评论 -
c++里对 new 、delete 运算符的重载
当然,当我们为类定义了 operator new () 和 operator delete () 函数以后,编译器就不再调用全局的同名函数,而是调用咱们自己定义的版本。源代码其实也是文本。可见咱们编写的 operator new() / delete() 函数的功能是完整的,可以像系统提供的同名函数一样使用,不会造成内存泄露。对 a + 5 的调用(a 是可调用对象),转换为 operator int ();对 a(5) 的调用(a 是可调用对象),转换为 operator ( ) (int);原创 2024-06-17 19:51:51 · 506 阅读 · 0 评论 -
c++ 里:对于函数和引用类型 is_const_v<const _Ty> = false ,这是编译器的特殊设置
原创 2024-06-14 03:52:58 · 336 阅读 · 0 评论 -
c++ 成员函数带后缀 volatile 的含义
以及。原创 2024-06-13 15:40:45 · 181 阅读 · 0 评论 -
c++编译器在什么情况下会提供类的默认构造函数等,与析构函数
我们都知道,在 c++ 里,编写的简单类,若没有自己编写构造析构函数与 copy 构造函数 与 赋值运算符函数,那么编译器会提供这些函数,并实现简单的语义,比如成员赋值。看 源码时,出现了下图类似的情形,在没有明确定义类的析构函数的情况下,调用了类的析构函数,那么这么做可以么?之所以加上类 B ,也是为了增加难度,让测试更有意义。原创 2024-06-08 18:48:33 · 275 阅读 · 0 评论 -
c++ 里函数选择的优先级:普通函数、模板函数、万能引用,函数重载的常量左值引用、右值引用,编译器选择哪个执行呢?
看大师写的代码时,除了在类里定义了 copy 构造函数,移动构造函数,还定义了对形参采取万能引用的构造函数,因此有个疑问,这时候的构造函数优先级是什么样的呢?因此,出现这种情况时,要注意编写的重载的构造函数的语义的一致性,避免出错。当又含有万能引用的构造函数呢?原创 2024-06-07 06:53:54 · 174 阅读 · 0 评论 -
c++ 模板类的泛化版本,只声明,不定义,可以么?可以
王建伟老师的课本,413 页讲解过这个情况。只要不创建泛化模板的对象即可。最近看源码时,也出现了这种情况,大师们也这么写。原创 2024-06-04 21:20:49 · 262 阅读 · 0 评论 -
基于 vs2019 c++20规范下的枚举类 enum 测试
看 STL 库里源代码时候,有枚举类的这样使用,觉得挺新奇的,故简化逻辑后给出例子,今后咱们自己定义枚举类时候,估计也要采用这样的框架:原创 2024-06-04 08:31:57 · 243 阅读 · 0 评论 -
关于 c++ cout << endl; 的源码解释
以前在王老师课上,老师提到过 endl 是一个函数模板。原创 2024-06-01 20:40:08 · 225 阅读 · 0 评论 -
用 typedef 定义指针类型
一般 typedef int A, 定义一个新类型。但也可以为指针定义新类型 typedef int* B , 则 B 就是指针类型。原创 2024-05-31 18:47:36 · 186 阅读 · 0 评论 -
如何在 c++ 里,让子类访问到父类的私有数据成员?答案之一:使用第三方友元类或友元函数
看 STL 库的代码时候,见有这种写法,感觉挺神奇的。故简化逻辑后,写个玩具验证一下。本来这是很别扭的做法。既然父类让数据成员私有了,还要让子类去调用,何苦呢?但看大师们的写法,果然 c++ 编译器还有这样的功能,此处也可以当成对对友元类友元函数的练习。原创 2024-05-30 07:29:06 · 285 阅读 · 0 评论 -
c++ 里重解释转换之于引用 reinterpret_cast< long& >
今天遇到了这一很新奇的写法。模糊中记得王老师也这么讲过。c++ 里四大转换。把数据重解释为原来数据的引用。虽然也可以直接定义对变量的引用。原创 2024-05-27 20:09:05 · 150 阅读 · 0 评论 -
vs2019 c++ 函数的返回值是对象的值传递时候,将调用对象的移动构造函数
以前倒没有注意过这个问题。但编译器这么处理也符合移动构造的语义。因为本来函数体内的变量也要离开作用域被销毁回收了。原创 2024-05-25 12:52:15 · 421 阅读 · 0 评论 -
测试 vs2019 c++ 64 位环境里的内置类型的大小与对齐取值
原创 2024-05-22 23:26:19 · 119 阅读 · 0 评论 -
c++ 里类的静态成员函数与动态成员函数的区别
类的定义的成员函数,若加了 static 修饰,则该函数可以在没有创建类对象的情况下,直接被调用。若没有加 static 修饰的成员函数,只有在创建了类对象后,由对象调用。因为动态成员函数在编译后的第一个形参是 this ,对象的地址。而 加了 static 的成员函数是没有 this 形参的,在 static 函数里甚至不能使用 this 关键字。可见两种成员函数在编译上的区别。原创 2024-05-20 16:49:36 · 208 阅读 · 0 评论 -
c++ vs2019:用父类指针访问子类对象,如何访问子类中继承的但被改为私有的虚函数?
咱们都知道, c++ 里类的私有函数不能被外界访问。只能被类内别的函数访问。原创 2024-05-16 21:34:42 · 219 阅读 · 0 评论 -
vs2019 c++里用 typeid() . name () 与 typeid() . raw_name () 测试数据类型的区别
(1) 都知道,在 vs2019 里用 typeid 打印的类型不大准,会主动去掉一些修饰符, const 和引用 修饰符会被去掉。但也可以给咱们验证学到的代码知识提供一些参考。那么今天发现其还有 raw_name 成员函数,这个函数会打印的更全面么?原创 2024-05-15 22:28:25 · 259 阅读 · 0 评论 -
关于 vs2019 c++20 规范里的 STL 库里模板 decay_t<T>
(1) 这个模板,在库代码里非常常见。decay 英文是“衰弱,消减” 的意思,大概能感觉到就是要简化模板参数 T 的类型,去掉其上的修饰符。因为常用且复杂,故单独列出其源码和注释。原创 2024-05-15 19:59:32 · 192 阅读 · 0 评论 -
关于 vs2019 c++20 规范里的一个全局函数 _Test_callable
(1)看名思议,觉得这个函数可以测试其形参是否是可以被调用的函数,或可调用对象?不,这个名字不科学。有误导,故特别列出。可见任意指针类型,只要非空,都可以使本函数返回 true。可是很多指针指向的并非使可执行的程序。所以以后咱们要是单独使用此函数,不要被其名字迷惑了。原创 2024-05-15 18:53:06 · 164 阅读 · 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 · 241 阅读 · 0 评论 -
探讨 cs2019 c++ 的STL 库中的模板 conjunction 与 disjunction
可以得出结论: conj 是为了查找逻辑布尔型模板参数中的第一个 false;若模板参数全是 true 则返回 true。(1)在 STL 库源码中这俩模板经常出现,用来给源码编译中的条件选择,模板的版本选择等提供依据。disJ 是为了查找模板参数中的第一个 true;模板参数全为 false 才返回 false。原创 2024-05-14 18:35:23 · 164 阅读 · 0 评论 -
分析 vs2019 c++ 中的 decltype 与 declval
可见,能总结出 : declval 函数返回了对其模板参数的右值引用。当不能为模板参数的对象添加引用,则返回模板参数本身。(1) decltype 可以让推断其参数的类型。(3) 结合 std::declval 的定义,比较好掌握使用其的语法。原创 2024-05-14 18:03:22 · 180 阅读 · 0 评论 -
测试 vs2019 c++ 在 32 位系统和 64 位系统里的 sizeof ( void * )
再看下反汇编:接着给出 32 位系统的结果:原创 2024-05-14 16:34:28 · 234 阅读 · 0 评论 -
vs2019 c++静态断言 static_assert ()
(1) 静态断言,就是在编译时候,让编译器测试一下, static_assert( bool a , “字符串”) 的第一个参数,若 第一个参数为 true ,则表明程序可以被编译。否则,编译器拒绝编译。这是为了满足某些代码在语法语义方面的要求。原创 2024-05-14 14:52:56 · 239 阅读 · 0 评论 -
vs2019 c++ 对左值引用取地址得到的是谁的地址?
(2) 用反汇编看一下,为了代码容易看懂,改一下源代码,不使用 cout 这个复杂的对象;对左值引用取地址,返回的地址是其引用的变量的地址,而非自身的地址。原创 2024-05-14 00:08:24 · 165 阅读 · 0 评论 -
vs2019 cpp20 规范的线程头文件 <thread> 注释并探讨几个问题(上)
接着在这一行代码里构建元组,并用实参对其初始化,并用独占智能指针指向这个新创建的 tuple 元组,其实这个元组就是将来线程执行时 的形参值,这些也作为函数中的局部变量的形参在内存中的位置。所以可以得出结论,线程中的函数,其形参是独一无二的,与 main 函数中创建线程时传递的实参没有任何关系。显然,函数形参的生存周期可能很长,是伴随线程存在,伴随其函数存在的。所以可见,在 thread 中构建的 tuple 元组,将只包含最基本的不含引用 ,const ,volatile 等修饰符的类型。原创 2024-05-12 22:56:51 · 504 阅读 · 0 评论 -
探讨 vs2019 c++ 里函数指针与函数类型在使用上的语法区别
(1)咱们可以用 decltype () 来判断函数的类型。但以这个类型定义有用的可指向已存在函数的变量,却行不通。所以函数类型只有语法意义。但在使用上没有函数指针有用。例如上面的 Fun 类型,没有构造函数等成员函数,啥用没有。原创 2024-05-11 19:39:46 · 195 阅读 · 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 · 230 阅读 · 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 · 340 阅读 · 0 评论 -
分析 vs2019 c++20 语法规范下的全局函数: _Pocca ,这涉及到分配器的传递
原因是形参 1 和 2 都是由 STL 的分配器 allocator 实例化的。彼此一模一样,不必再复制。从此源码得出结论,如果不自己写分配器,使用 STL 提供的标准分配器。那么由上图可知, 函数 _Pocca 中的 if 语句将不会得到执行。可见咱们的猜测是对的。原创 2024-05-09 03:38:53 · 203 阅读 · 0 评论