- 博客(10)
- 收藏
- 关注
原创 侯捷C++内存管理课堂笔记(2)
上图,依旧是在类中写allocator,与第一个版本不同的是,这里将指针与对象存放在同一地址空间内,当这块内存使用时,存放data,不使用时,取前四个字节作为指针,与链表链接起来。但是在实际环境中,每个类都要写对应的分配器的话,会很麻烦,既然作用都一样,不如将allocator以对象的形式放在类中,就不用重复写了。2.#208,#218,#255中都用int值与变量比较大小,而不是用变量与int比较大小,原因是在写代码时,如果忘记少写一个等号,采用图片中方法,系统会报错,从而及时修改。
2025-07-20 12:04:57
356
原创 侯捷C++内存管理课堂笔记(1)
存放3的内存块叫cookie,记录array的长度。如此,如果int* p=new int[4],那么在这样的例子中,默认的析构函数是trivial dtor,使用delete和array delete都可以,无非是调用几次析构函数的区别。函数中,不断使用malloc申请分配内存,一般不会申请失败,当内存确实满了,就调用程序员自己写的函数来清空一些指定的内存并再次分配。delete也是同理的,先调用析构函数,在调用operator delete,而operator delete底层实际是free。
2025-07-17 21:04:02
261
原创 侯捷C++11/14新特性课堂笔记(3)
因为obj是一个模版参数类型,是不确定的,所以实际场景中,T::iterator可能是变量、函数、静态成员等等,这里,我们需要T::iterator表达的是一种类型,如果不加上typename,编译器会因为它的不确定性而不编译通过。当函数的返回类型不好判断时,可以使用decltype声明函数返回类型,但第一种格式是不行的,因为编译器从上往下编译,当遇到x+y时,对应的add函数编译器还不知道,所以编译失败。因此,采用返回类型后置法,就是第二种格式,此处,auto是一个占位符,真正的返回类型在->后。
2025-07-10 21:44:43
786
原创 侯捷C++11/14新特性课堂笔记(2)
因为包是initializer_list<T>类,拷贝构造函数中需要的是P类,要将initializer_list<T>转换成P类需要P类的构造函数,p4的包里是三个变量,只能选择图片里从上往下的第二第三构造函数,第三构造函数有explicit,是不允许隐式转换的,而将initializer_list<T>转换成P类就是隐式转换,所以会报错,但这里没有报错,说明编译器选择了第二构造函数。其中,两个变量初始化的报错,在我的C++11版本的dev-C++和C++17版本的VScode中是不成立的。
2025-06-29 22:51:03
794
原创 侯捷C++11/14新特性课堂笔记(1)
C++11新特性摘要:可变参数模板通过特化与泛化结合实现更实用场景,也可用于类的递归继承。nullptr取代0/NULL作为类型安全的空指针。统一初始化使用大括号{},背后依赖initializer_list类,该类关联array容器而非原生数组,因其提供迭代器等接口兼容STL算法。这些特性广泛应用于现代C++的算法和容器实现中。(149字)
2025-06-27 22:47:47
253
原创 侯捷C++面向对象高级编程课堂笔记(5)
比如,A类中用B类定义了一个变量,B类中又定义了C类的一个变量。那么调用A类的构造函数,在A类的构造函数中需要调用B类构造函数,B类构造函数中需要调用C类构造函数,然后C类构造函数开始执行,接着B类构造函数,最后A类构造函数,如此,由内而外、可以想象一下,构造函数是一圈套一圈的,圈的最中央就是C类,最外面就是A类,中间就是B类。委托:类中的data类型声明为别的类指针,如此一个指针指向不同的对象,或者说多个对象的指针指向同一个对象。复用:类中的data类型声明为别的类,通过将两个类进行组合的方式进行复用。
2025-03-26 20:47:01
179
原创 侯捷C++面向对象高级编程课堂笔记(4)
{...............}像这种两个大括号之间,就是函数作用域,stack就是存在于某作用域的一块内存空间,如果当前作用域调用别的函数,那么在当前作用域内又出现新的作用域,函数结束后,作用域的内存也消失了,符合stack后进先出的规则。如果s1与s2不等,那么先删除s1中的数据并释放内存,接着重新给s1赋内存空间,然后将s2的数据通过C库中的strcpy函数拷贝给s1,最后返回s1。//operator delete也是一个特殊命名的函数,其调用了C中的free函数,释放指针的内存。
2025-03-25 20:11:28
401
原创 侯捷C++面向对象高级编程课堂笔记(3)
cout是C++标准库中的一个对象,它可以说一开始就在,当有程序员新写出来的类时,它没办法调用新类中的成员函数,如果"<<"的重载函数也是成员函数,那么就无法按照格式输出复数,所以"<<"的重载函数必须是非成员函数。如果加上const,那么os就无法变化了,返回的引用也就不是程序员想要的返回内容。上述例子中,函数返回的对象就是临时对象,当临时对象离开其所在函数,它也就消失了。如果通过引用返回,接收者什么也没得到。os<<'(',这一步,将'('符号送入os中,然后返回一个ostream类的引用,不断往复。
2025-03-24 20:23:28
258
原创 侯捷C++面向对象高级编程课堂笔记(2)
而class中非const的函数可能会存在改动private中data的行为,因为这种不确定性,当具有const属性的variable调用非const属性的class中函数时,编译器就会报错。顾名思义,友元函数,就是朋友函数,C++中允许朋友访问自己相对隐私东西,因此,class的友元(friend)函数能够使用class中的private属性的data。考虑函数的参数传递与返回类型时,先考虑能不能使用引用,如果不能那就不使用。此时,func函数中竟然可以调用c1的private属性的data。
2025-03-23 22:00:55
161
原创 侯捷C++面向对象高级编程课堂笔记(1)
1.include <iostream.h>与include "complex.h"的区别是,<>代表标准库,下载编译器时自带的,""代表头文件,程序员自己编写的。目的是防止当同一个头文件出现嵌套时,重复定义内容的情况。这是C++程序编写规范中的一条。第一种称为初始化,第二种称为赋值,初始化会比赋值少一些步骤,因此更高效。#ifndef 头文件名_H。#define 头文件名_H。
2025-03-22 21:11:53
189
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人