
C++ Develop
文章平均质量分 95
zhangcoder
大一 KEEP CODING!
展开
-
CD42.vector模拟实现(1)
基于SGISTL的vector模拟实现过程,主要包括框架搭建和核心功能实现。文章首先回顾了vector相关知识,对比了SGISTL中vector的结构设计,重点分析了start、finish、end_of_storage三个关键迭代器成员的作用。接着详细讲解了构造函数、capacity/size计算、迭代器获取、reserve扩容、push_back插入等核心功能的实现方法,特别处理了空vector和扩容两种情况。通过内置类型int和自定义类型string的测试用例验证了实现的正确性原创 2025-05-28 16:01:29 · 659 阅读 · 0 评论 -
CD41.补充vector细碎的知识点
补充C++中vector知识点:1. vector初始化方式,包括使用迭代器范围和数组指针;2. 对比vector<char>与string,说明string的专业性;3. sort函数的升序/降序排序方法,演示反向迭代器和greater的用法;4. 强调reserve与resize的区别;5. 介绍data()成员函数访问底层数组;6. 二维vector的两种访问方式,包括operator[]重载和data()指针操作原创 2025-05-26 09:54:35 · 809 阅读 · 0 评论 -
CD40.【C++ Dev】string类的模拟实现(4)
本文探讨了C++中operator=和拷贝构造函数的现代写法,并分析了错误写法的原因。传统operator=写法涉及深拷贝,现代写法则通过临时对象和swap函数实现更简洁的代码。错误写法会导致死循环调用,引发栈溢出。拷贝构造函数的现代写法通过初始化临时对象并交换成员变量来避免野指针问题。此外,文章还介绍了写时拷贝(Copy-On-Write)技术,该技术通过延迟内存分配来优化内存使用,并在需要修改时才创建副本。测试代码展示了这些写法的实际效果。原创 2025-05-20 08:40:49 · 890 阅读 · 0 评论 -
CD39.【C++ Dev】string类的模拟实现(3)
本文主要讨论了C++中字符串操作的实现,包括resize、operator<<、operator>>以及字符串比较操作符的实现。首先,resize函数用于调整字符串大小,并根据新大小进行填充或截断。其次,operator<<用于输出字符串,必须引用返回以避免拷贝。接着,operator>>用于从输入流中读取字符串,通过缓冲数组优化了性能。最后,详细讨论了字符串比较操作符(如<、>=、==等)的实现,通过memcmp和自定义逻辑确保比较的准确性。文章原创 2025-05-18 09:29:32 · 832 阅读 · 0 评论 -
CD38.【C++ Dev】string类的模拟实现(2)
本文详细介绍了C++中string类的模拟实现,重点讲解了append、operator+=、insert、erase、find和substr等常用成员函数的实现方法。文章通过代码示例和测试代码,展示了如何实现字符串的追加、插入、删除、查找和子串提取等功能。每个函数的实现都考虑了边界条件和内存管理,确保代码的健壮性和效率。例如,append函数在追加字符串前会检查是否需要扩容,insert函数在插入字符时会移动数据以避免覆盖,erase函数则根据参数的不同情况删除指定范围的字符。通过这些实现,读者可以深入理原创 2025-05-14 14:09:03 · 1062 阅读 · 0 评论 -
CD37.【C++ Dev】string类的模拟实现(1)
1.string基本知识的回顾2.简单的模拟实现准备操作代码实现成员变量构造函数C风格构造的函数无参构造函数C风格构造的函数与无参构造函数合二为一析构函数c_str()size()operator[ ]可读可写只可读iterator(指针版)begin()和end()push_back(char c)原创 2025-05-10 08:40:52 · 671 阅读 · 0 评论 -
CD36.【C++ Dev】STL库的string的使用 (下)
优点:写reserve后,插入少量字符时后面不需要扩容,避免异地扩容消耗时间有可能reserve的参数大小比原字符串的大小要小,但有字符串的情况下reserve不会缩容,且不会改变size[点击并拖拽以移动]如果没有字符串的情况下(即空串),可能会缩容,也可能什么都不做,具体和STL的实现有关(因为没有规定要缩容,而且缩容是释放原空间,开辟新的小空间,用时间换空间,代价较大,因此不建议使用与缩容有关的函数)如果reserve()比capacity小,不HJ1 字符串最后一个单词的长度。原创 2025-05-07 14:19:51 · 1096 阅读 · 0 评论 -
CD35.【C++ Dev】STL库的string的使用 (中)
下断点到return 0,查看监视窗口begin和end的值,发现end里面的ptr指向的是"helloworld"字符串结尾的\0。clear()使size()清零,但没有改变capacity(),这是因为避免可能再次对str添加字符带来扩容的麻烦。对于同样的string类字符串,不同操作系统的不同平台的编译器capacity()返回的值不尽相同,具体和。end():指向不可以修改(只读)的string类字符串(c为const的首字母)begin()和end():指向两种类型的string类字符串。原创 2025-05-03 10:08:37 · 1086 阅读 · 0 评论 -
CD34.【C++ Dev】STL库的string的使用 (上)
传参的类型为const string,为拷贝构造,只不过是拷贝构造str的子串,显然第3个参数是缺省参数,如果不写,默认从pos位置一直截取的string风格的字符串的结尾。,(具体的扩容策略和编译器的处理有关,没有统一的规定),C语言strcat,不能自动扩容且找\0耗时。发现\0不显示,且不占位,因为VS认为str[i]超出界限,因此没有为\0占位。const char*为C语言风格的字符串类型,因此为使用C风格的字符串构造。猜测这是为变量i赋初值,因此[ebp-3Ch]存的是i的值, 由。原创 2025-04-28 09:54:05 · 1053 阅读 · 0 评论 -
CD33.【C++ Dev】初识模版
可以类比模具,优点:将数据类型作为参数传递,这样就不需要为不同的数据类型编写相同的代码模版其实是有泛型编程的思想: 编写与类型无关的通用代码,是代码复用的一种手段改造CD14.【C++ Dev】类和对象(5) 析构函数和拷贝构造函数文章的代码public:return;top = 0;~MyStack()//需要手动释放资源free(a);int top;T* a;int top。原创 2025-04-27 10:08:19 · 1171 阅读 · 0 评论 -
CD32.【C++ Dev】类和对象(22) 内存管理(下)
6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。3. malloc申请空间时,需要手动计算空间大小并传递.new只需在其后跟上空间的类型即可,如果是多个对象,[]中指定对象个数即可。4. malloc的返回值为void*,在使用时必须强转,new不需要,因为new后跟的是空间的类型。free只会释放空间,不会调用析构函数,结束后需要手动置空(第6点)原创 2025-04-26 19:47:33 · 1012 阅读 · 0 评论 -
CD31.【C++ Dev】类和对象(21) 内存管理(中)
注:operator new[]实际多次调用operator new和构造函数,operator delete[]实际多次调用析构函数和operator delete。(如果malloc申请空间,成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常)先调用析构函数~Mystack():释放_arr指向的空间,并为_arr置空,将_capacity和_size清零。malloc申请空间如果失败,会返回空指针,但是new和malloc不同,new申请空间失败会。原创 2025-04-22 09:39:44 · 606 阅读 · 0 评论 -
CD30.【C++ Dev】类和对象(21) 内存管理(上)
目录1.前置知识易错点汇编语言底层分析常量区的字符串拷贝到栈区2.new和delete知识回顾分析new和delete的细节new不带参的构造函数带参的构造函数deletenew和malloc不能混用,delete和free也不能混用使用new和delete操作对象时,构造函数和析构顺序明确以下内容:程序运行会产生一些数据,而这些数据可以是局部数据、静态数据、全局数据、常量数据、动态申请的数据等,数据需要在内存中的不同区域存储,这些不同区域为:栈区、堆区、静态区(又称数据段,存储全局数据和静态数据)、常量区原创 2025-04-21 10:07:03 · 1153 阅读 · 0 评论 -
CD29.【C++ Dev】类和对象(20) 构造函数和拷贝构造函数的优化
的左边的ret类型为Myclass,右边1类型为int,如果使用赋值符号,如果没有优化,编译器会使用1去构造一个临时对象,再将这个临时对象拷贝构造给ret;时,先调用func函数,因为函数接收的参数是Myclass obj,,再将这个匿名对象拷贝构造给func的形参,由于是连续构造,编译器会优化为一次构造。,再将这个临时对象拷贝构造给func的形参,由于是连续构造,编译器会优化为一次构造。,再将这个临时对象拷贝构造给func的形参,由于是连续构造,编译器会优化为一次构造。原创 2025-04-20 09:24:43 · 916 阅读 · 0 评论 -
CD28.【C++ Dev】类和对象(19) 内部类练习题和匿名对象
/没有名字return 0;Myclass(1);是一个没有名字的对象,即匿名对象。原创 2025-04-15 09:04:22 · 874 阅读 · 0 评论 -
CD27.【C++ Dev】类和对象 (18)友元和内部类
否则编译器在遇到Myclass1的友元函数的声明friend void function(const Myclass1& obj1, const Myclass2& obj2);友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员,这是由friend的特性实现的。解释:const修饰一般修饰的是成员函数,显然友元函数不属于任何类,3.友元函数可以在类定义的任何地方声明,不受类访问限定符限制。因为友元函数不属于任何类,所以可以是多个类的友元函数。,这里介绍友元函数的几个特点。原创 2025-04-14 11:05:15 · 1121 阅读 · 0 评论 -
CD26.【C++ Dev】类和对象(17) static成员(下)
由于Myclass定义在Solution外,如果Sum_Solution()函数要取得_ret的值,在Myclass类中需要定义一个GetRet()函数来取得。文章中的特点6提到过:原本的静态成员函数的参数是没有隐藏this指针的,而调用非静态成员函数需要传this指针,因此不可以调用。则_ret初始化为0,_i初始化为1,执行一次构造函数时,_ret+=_i并且_i++需要用两个静态变量,一个存储累加的和(_ret),一个来控制每次相加的数字(_i)如果要强行调用非静态成员函数其实也是可以的,不过要。原创 2025-04-10 14:45:47 · 1054 阅读 · 0 评论 -
CD25.【C++ Dev】类和对象(16) static成员(上)
不添加int main()function();function();return 0;分析:虽然调用两次function函数,但是myobj只会初始化一次,因此打印结果都是1。原创 2025-04-09 14:54:28 · 775 阅读 · 0 评论 -
CD24.【C++ Dev】类和对象(15) 初始化列表(下)和对象隐式类型转换
由CD23对缺省参数和初始化列表的关系的说明可知:所有成员变量在初始化时都要走初始化列表,_val给了缺省参数0,则在执行_val = 10前,_val的值应该为缺省参数0。,1._val2(_val1)可以看出,_val2初始化的是_val1的值,但_val1此时还没有初始化,操作系统为_val1内存空间赋的是随机值,导致_val2是随机值。Myclass myobj2(1)传了一个参数,因此初始化时会调用Myclass(int data),导致_va的值l被初始化为10。原创 2025-04-08 08:08:22 · 1077 阅读 · 0 评论 -
CD23.【C++ Dev】类和对象(14) 取地址重载函数和初始化列表(上)
1.CD22文章的4个问题的分析2.普通对象取地址重载函数和const 修饰的对象据地址重载函数3.构造函数中的初始化列表成员函数初始化的两种方法 方法1:函数体内赋值方法2:初始化列表格式代码示例注意事项引用成员变量必须在初始化列表中初始化const成员变量必须在初始化列表中初始化自定义类型成员必须在初始化列表中初始化(且该类没有原创 2025-04-06 09:54:09 · 758 阅读 · 0 评论 -
CD22.【C++ Dev】类和对象(13) 流提取运算符的重载和const成员
表示this指向的对象可以修改,void Date::Print() const表示this指向的对象不可以修改,从可以修改到不可以修改为权限的缩小,正常运行。d1<d2的执行会有问题,由d1的定义可知:d1的成员对象不能修改,而bool Date::operator< (const Date& d2)第一个参数为this,与d1的地址对应,导致。Print()中隐藏的参数是this,虽然this指针的类型为const Date*,但是 const Date*中const。原创 2025-04-03 15:11:19 · 1069 阅读 · 0 评论 -
CD21.【C++ Dev】类和对象(12) 流插入运算符的重载
operator<<(ostream& out, const Date& d)的第一个参数不能用const修饰,因为向流中插入东西,对<<运算符重载,让它可以支持自定义类型的打印(不能使用printf,只支持内置类型,)例如:cout<<d2<<d3<<d1→cout<<d3<<d1→cout<<d1。若理解了两个参数的含义和用法,则cout << d1 << d1;但如果连续使用<<就会出现错误,例如cout << d1 << d1;执行,则cout << d1 << d1转换为void << d1。原创 2025-04-01 19:58:38 · 779 阅读 · 0 评论 -
CD19.【C++ Dev】类和对象(10) 日期类对象的成员函数(日期+天数)
天数加在日上,有可能会溢出,需要进位则需要考虑每一个月最多多少天,而且二月份比较特殊(闰年2月有29天,非闰年2月有28天),可以写一个函数来取得每个月的天数。优化1:day数组为局部数组,每次调用该函数,程序都会创建day数组,如果多次调用,该步骤会消耗大量时间,可以尝试使用全局数组或者将数组放到静态区上。结果:拷贝对象一共四次(过程图有问题去问问!(注:Date tmp(*this)传的是*this,为Date::Date(const。日期+天数:显然需要重载"+",操作:?原创 2025-03-28 15:08:36 · 1089 阅读 · 0 评论 -
CD18.【C++ Dev】类和对象(9) 声明和定义分离的写法以及代码复用
Date::Date(int year , int month, int day)//指定类域_day = day;Date::Date(const Date& x)//指定类域void Date::Print()//指定类域bool Date::operator< (const Date& d2)//指定类域注:当声明和定义分离时,定义需要写类域,否则编译器无法区分是普通函数还是成员函数。原创 2025-03-25 19:00:22 · 953 阅读 · 0 评论 -
CD17.【C++ Dev】类和对象(8) 赋值运算符
目录1.赋值运算符重载不是拷贝构造,也不是初始化2.实现赋值运算符重载分析实际上这样写会有潜在的问题:连续赋值问题的解决提问分析变式问题3.优化赋值运算符分析4.默认的赋值运算符5.重要说明对比以下代码:赋值运算符重载:已经存在的两个对象之间的拷贝(如d3 = d1)构造函数:用一个已经存在的对象去初始化另一个对象例如对于以下的Date类,实现赋值运算符重载分析如果按照CD15文章的运算符重载格式可能,写出以下代码测试以下代码,下断点到return 0,查看d1和d2的成员变量貌原创 2025-03-22 09:56:28 · 1181 阅读 · 0 评论 -
CD16.【C++ Dev】类和对象(7) 运算符重载
可以写一个cmp_date函数,返回类型为bool型,为了避免传值,使用传引用调用const Date&类外定义运算符重载的缺点:如果成员变量为私有或者保护,将不能被访问(目前先这样理解,之后有解决方法)是否重载运算符要看重载后的运算符是否有意义,例如日期+日期或者日期-日期没有任何意义,没有必要重载。相比于cout << cmp_date(d1, d2) << endl;5.用于内置类型的运算符的含义不能改变,比如内置的整型+,不能改变其含义。<没有内置这样的比较规则,所以会报错,原创 2025-03-21 14:15:19 · 943 阅读 · 0 评论 -
CD15.【C++ Dev】类和对象(6) 拷贝构造函数的其他说明
之前在文章中提到过拷贝构造函数的第三个特点:若未显式定义,编译器会生成默认的拷贝构造函数,默认的拷贝构造函数对象按字节序完成拷贝,即浅拷贝或值拷贝public:MyQueue不需要写它的拷贝构造,直接调用自定义类型MyStack的拷贝构造return st;MyStack st;return st;MyStack st;return st;return st;原创 2025-03-20 09:01:03 · 988 阅读 · 0 评论 -
CD14.【C++ Dev】类和对象(5) 析构函数和拷贝构造函数
int _month;int _day;运行结果:通过运行结果反向观察:调用function()函数前,先调用了Date的拷贝构造函数也可以在function(d1);处下断点,看看下一步要做什么:按F11后,发现先调用了Date的拷贝构造函数最后才调用了function函数本身则有以下。原创 2025-03-19 16:10:36 · 1066 阅读 · 0 评论 -
CD13.【C++ Dev】类和对象(4) 构造函数和析构函数
1.类的默认成员函数分类默认成员函数一共6个,即如果不手动写,编译器也会默认生成的函数1.初始化和清理函数构造函数:负责初始化工作析构函数:负责资源清理工作2.拷贝和赋值函数拷贝构造函数:负责使用同类对象初始化创建对象工作赋值重载函数:负责把一个对象赋值给另一个对象工作3.普通对象取地址重载函数和const 修饰的对象据地址重载函数这个两个很少手动实现,故不介绍2.构造函数和析构函数之前在CC24.【C++ Cont】结构体文章中讲过这两个函数,但讲的比较浅,这里深入原创 2025-03-18 07:53:17 · 848 阅读 · 0 评论 -
CD12.【C++ Dev】类和对象(3)
文章中讲过lea指令的作用,即传指针的值,ecx作为中转寄存器,存放了d1对象的地址,准备为Init成员函数传参。),尽管this指针为空,但是并没有发生访问错误,因此Print函数正常执行,打印Print()字符串。前三个push遵循从右向左的压入参数的规则:压入参数的顺序为7,3,2025(7E9h),之前在文章中提到过,class和C语言的struct有区别的,成员函数放在。举一个调用例子: d1.Init(2025, 3, 7);,访问了成员变量_a,但this指针为空,因此会发生非法访问。原创 2025-03-13 08:19:40 · 632 阅读 · 0 评论 -
CD11.【C++ Dev】类和对象(2)
都是调用同一个函数Init,之前提到过成员函数存放在公共代码段,那日期的数据是怎么存放到对象中的呢?其实对象中不存放成员函数是有原因的:每个对象中成员变量是不同的,但是调用同一份函数,如果按照此种方式存储,当一个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。解决方法:代码只保存一份,在对象中保存存放代码的地址,只保存成员变量,成员函数存放在。,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”如果对象中只有成员函数,那么对象的大小为1字节(原创 2025-03-12 15:48:00 · 1122 阅读 · 0 评论 -
CD10.【C++ Dev】类和对象(1)
原因:虽然是相同的函数,但是属于不同的类域,因此互不干扰struct Astruct B原因:成员变量写在前面或者后面都能找到,因为类域是整体struct Aint a;a = 1;//使用上方定义的a或者struct Aa = 1;//使用下方定义的aint a;a = 1;注意struct和class的格式:结尾有分号!原创 2025-03-09 09:53:17 · 845 阅读 · 0 评论 -
CD7.【C++ Dev】引用&(reference) 下
承接CD6.【C++ Dev】引用&(reference) 中文章,介绍权限的平移 缩小 扩大的问题以及引用的实质和一道面试题原创 2025-03-08 09:52:21 · 791 阅读 · 0 评论 -
CD9.【C++ Dev】对“auto替换为变量实际的类型”的解释
之前在文章中提到了如下内容:即auto并非是一种“类型”的声明,而是一个类型声明时的“”,编译器在编译期间(预编译-->编译-->汇编-->链接,在第二个阶段完成以后)会将auto为变量实际的类型(具体是怎么替换的参见C++ Dev专栏的文章,竞赛中不要求掌握)本文将解释以上内容。原创 2025-02-28 14:13:15 · 392 阅读 · 0 评论 -
CD8.【C++ Dev】auto、范围for、内联函数和nullptr
注意:编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量例如上方代码的a和b,编译器只对a推导,推导出的类型用来定义变量b。原创 2025-02-27 15:19:44 · 1468 阅读 · 0 评论 -
CD5.【C++ Dev】引用&(reference) 上
竞赛中的传引用调用讲的有点粗略,本文详细介绍引用的几个特性及应用。原创 2025-02-26 15:03:21 · 752 阅读 · 0 评论 -
CD4.【C++ Dev】函数重载
(stack.h、stack.cpp、main.cpp-->stack.i、main.i)细节:stack.h、stack.cpp合成stack.i,同理,stack.h和main.cpp合成main.i。4.链接(stack.o、main.o-->Linux下的a.out,Windows下的*.exe)3.汇编:汇编代码转为机器码(stack.s、main.s-->stack.o、main.o)其中<...>内为函数的修饰名,很显然,gcc将C文件的函数名直接作为函数的修饰名。原创 2025-02-23 09:25:53 · 1273 阅读 · 0 评论 -
CD3.【C++ Dev】头文件、缺省参数
下面的代码的函数的写法是错误的,没有遵守缺省参数的规则//......VS上的报错显示: error C2548: “function”: 缺少形参 3 的默认实参例如:function(1),这个1给a还是给c的呢?有歧义,不允许这样写!改成下面这样就行了//......结论:从右往左缺省,为了防止歧义,即所有有默认值的参数必须位于参数列表的末尾。原创 2025-02-20 09:28:33 · 1101 阅读 · 0 评论 -
CD2.【C++ Dev】 命名空间
int val;}//不要加";嵌套还是为了隔离,防止冲突int a = 0;int a = 1;int c = 2;上方代码有两个a,但含义不同。原创 2025-02-22 09:37:05 · 1054 阅读 · 0 评论 -
CD1.【C++ Dev】C++的简单介绍
目录1.C++简介2.发展3.应用领域先上图: )C语言:高效、简洁、底层,适合系统级开发。C++语言:强大、灵活、支持面向对象,适合高性能和复杂系统开发。C#语言:现代化、简洁、安全,适合快速开发各种应用,尤其是基于.NET框架的应用Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言.为了表达该语言与C语言的渊源关系,命名为C++,所以C++是兼容C语言的.(C++之父照片 来自他的个人网站)因此C++既可以进行C语言的过程化程序设计,又可以进行以原创 2025-02-19 14:58:34 · 849 阅读 · 0 评论