- 博客(23)
- 收藏
- 关注
原创 c++模板初阶
泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。在自动类型推导中,不能根据返回值去推导,但是可以显示实例化去推导。类模板实例化与函数模板实例化不同,模板分为函数模板和类模板。,对于字符类型也是如此。,对于模板函数的使用,⑤模板参数的匹配规则。
2024-05-14 09:30:00
185
原创 C++内存管理new/delete和new[ ]/delete[ ]
这里const修饰的是指向的内容不能修改,但是pchar3可以改变,所以pchar3在栈上,pchar3是一个指针变量,存的常量区字符串abcd\0的地址,指向的常量区,所以*pchar3在常量区,即常量区的a, 如下图所示。常量放在常量区,全局变量和全局静态变量在主函数之前就创建好了,生命周期在整个程序运行期间都在,局部的静态变量在第一次调用的时候才会创建,数组也在栈上。因为内存池分配出的内存没有初始化,所以如果是自定义类型的对象,需要使用new。只需在其后跟上空间的类型即可, 如果是多个 对象,[]
2024-05-12 23:19:34
836
原创 初始化列表、static成员和友元函数
内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。输出1 和 随机值,可见初始化顺序和成员变量的声明顺序一致,先初始化_a2,再初始化_a1。友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。但是非静态成员函数可以调用类的静态成员函数。,不属于任何类,但需要在类的内部声明,声明时需要加。修饰,并且友元函数不是类的成员函数,就是一个。,不属于某个具体的对象,存放在静态区。
2024-05-08 22:57:53
650
原创 C++运算符号重载和const成员函数
注意:传值返回并不是d作为返回值,因为d出了作用域就销毁了,传值返回会生成一个当前对象的拷贝,拷贝的是一个临时对象,临时对象作为这个表达式的返回值,这个临时对象的生命周期不在这个函数里面,用引用返回就可以不生成这里的拷贝了,用引用返回是生成的d的别名。此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数。注意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值。一旦涉及到资源管理则必。
2024-05-06 16:10:39
930
原创 类和对象(中)(构造函数、析构函数和拷贝构造函数)
这里用d1去构建d2,规定需要调用拷贝构造,调用拷贝构造得先传参,先传参形成了一个新的拷贝构造,新的拷贝构造假设去调用,去调用这个拷贝构造,又要先传参,从逻辑上来说就是一个无穷递归。与构造和析构函数一样,内置类型就直接传,自定义类型传值传参就要调用拷贝构造完成,这里调用func之前先传参,传参就会形成一个拷贝构造,d是d2的别名,函数结束回来,传参完成,参数的传递就是完成拷贝构造调用,最后调用调用func函数,结束。对于自定义类型的成员变量,才会调用他的默认成员函数即无参构造,如果没有无参构造会报错。
2024-04-18 21:57:14
1071
原创 C++类和对象注意事项(上)(类的对象大小计算和this指针)
this指针存放位置:堆是malloc出来的,静态区存放静态数据和全局数据,常量区存放常量,栈存放形参,形参和局部变量都存在栈上,函数调用,建立栈帧,this指针是形参一般是存放在栈上,有些地方会直接放在寄存器里面,因为寄存器访问特别块,一般情况是栈。类实例化的每个对象中的成员变量是不同的,但是调用同一份函数,调用的成员函数地址都是一样的,如果每个对象内部都放一份,会造成大大的浪费。小端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处。
2024-04-16 16:55:07
1039
原创 C++函数重载、引用、内联函数、auto关键字和C++11范围for
接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效。以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直。如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办。,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运 行效率。率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。引用概念上定义一个变量的别名,指针存储一个变量地址。
2024-04-13 21:51:00
1054
原创 C++命名空间、输入&输出和缺省参数
类型,命名空间还可嵌套,命名空间域都是修饰全局的,它不会影响生命周期,注意:用{ }扩起来的都是域。编译默认查找顺序:①当前局部域 ,②全局域和展开的命名空间中查找。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。② 缺省参数不能在函数声明和定义中同时出现(一般在出现在函数声明中)大家好,这篇文章对C++中命名空间的使用注意事项进行了总结。定义命名空间:namespace+名字+{ },命名空间中的所有内容都局限于该命名空间中。{ }为命名空间的成员,
2024-04-09 22:01:53
179
原创 C语言内存函数及其注意事项
①函数memcpy从source的位置开始向后赋值num个字节的数据到destination指向的内存位置。memmove函数处理的源内存块和目标内存块是可以重叠的,但是memcpy不可以。③如果source和destination有任何的重叠,复制的结果都是未定义的。如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。memset是用来设置内存的,将内存中的值以字节为单位设置想要的内容。比较ptr1和ptr2指针指向的位置开始,向后的num个字节。举例二:内存中的值以字节为单位设置想要的内容。
2024-02-14 09:44:29
373
1
原创 C语言中字符函数和字符串函数注意实现
程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应的错误码,存放在errno中,strerror函数就可以将错误对应的错误信息字符串的地址返回。⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。将src指向字符串的前num个字符追加到des指向的字符串末尾,再追加一个\0,注意是从des的\0位置开始追加,会覆盖des的\0。直接将错误信息打印出来。
2024-02-10 09:01:37
865
1
原创 sizeof和strlen的对比以及经典的指针运算案例
②srtlen是求字符串⻓度的,统计的是。注意,这里arr[0]是第1行的数组名,arr[1]是第1行的数组名,arr[2]是第3行的数组名。①sizeof计算的是变量所占内存空间的大小,单位是字节,只关注占用内存空间的大小。①sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节。①sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。②&数组名,数组名表示整个数组,取出的是整个数组的地址。②&数组名,数组名表示整个数组,取出的是数组的地址。
2024-02-02 10:00:00
357
原创 回调函数和qsort函数的使用
回调函数就是⼀个通过函数指针调⽤的函数。如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应。2.qsort函数使用需要包含头文件#include<stdlib.h>,qsort函数的各个参数如下。qsort函数的模拟实现如下,使⽤回调函数,模拟实现qsort(采⽤冒泡的⽅式)。①使用qsort函数排序整型数组。
2024-01-31 18:37:29
385
原创 C语言指针注意实现(3)之数组指针和函数指针
C/C++会把常量字符串存储到单独的⼀个内存区域, 当⼏个指针指向同⼀个字符串的时候,他们实际会指向同⼀块内存,也即内容相同的常量字符串只会保存一份。根据数组名是数组首元素的地址规则,二维数组的数组名就是第一行的地址,是一维数组的地址。说明p是⼀个指针变量,然后指向的是⼀个⼤⼩为10个整型的数组。⼆维数组传参本质上也是传递了地址,传递的是第⼀行这个⼀维数组的地址,那么形参也是可以写成指针形式的。3.数组指针变量,数组指针变量也是指针变量,存放的是数组的地址,是能够指向数组的指针变量。
2024-01-28 17:35:58
346
原创 C语言指针注意事项(2)
顾名思义,指针数组是存放指针的数组,如int *arr[5],该指针数组的每个元素是用来存放(指针)的,指针数组的每个元素是地址,又可以指向一块区域。①sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩, 单位是字节。arr[i]是访问arr数组的元素,arr[i]找到的数组元素指向了整型⼀维数组,arr[i][j]就是整型⼀维数。&数组名,这⾥的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素。量求出元素的地址,然后解引⽤来访问的。
2024-01-24 22:28:26
383
1
原创 C语言指针注意事项(1)
NULL 是C语⾔中定义的⼀个标识符常量,值是0,0也是地址,这个地址是⽆法使⽤的,读写该地址会报错。12.指针-指针的绝对值是指针和指针之间的元素个数,指针减指针运算的前提条件是两个指针指向同一块空间。int* p=&a;const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指。注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,⼤⼩都是相同的。
2024-01-17 21:18:51
1004
原创 c语言操作符注意事项
原因在于,使⽤补码,可以将符号位和数值域统⼀ 处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。2.有符号整数的原码,反码和补码均由符号位和数值位构成,2进制序列中,最高位的一位被当作是符号位,剩余的都是数值位。如果某个操作符的各个操作数属于不同的类型,那么除非其中⼀个操作数的转换为另⼀个操作数的类型,否则操作就⽆法进⾏。注意它们的操作数必须为整数,然后转换为二进制整数对二进制位进行操作,^为异或操作符,对应位相同为0,相异为1;
2024-01-11 17:52:11
1159
原创 c语言中函数递归
这⾥我们看到了,在计算第40个斐波那契数的时候,使⽤递归⽅式,第3个斐波那契数就被重复计算了 39088169次,这些计算是⾮常冗余的。所以斐波那契数的计算,使⽤递归是⾮常不明智的,我们可以使用迭代的⽅式解决。可以通过设计一个函数myprintf(n),如果n大于9,就调用函数myprintf(n/10),当n<=9时,就调用函数printf("%d",n)来打印;①递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。举例二,输入一个整数,按照顺序从左往右打印整数的每一位。
2024-01-09 20:12:45
416
原创 C语言函数注意事项
原因:static修饰局部变量时,改变了局部变量的生命周期,原本存储在内存栈区的局部变量,被static修饰后存储到了静态区,于是就与全局变量一样,生命周期和程序的生命周期一样,程序结束,变量销毁,内存回收。左边图片中的代码中的test函数中局部变量i每次进入test函数先创建变量(生命周期开始)并赋值为0,然后++,再打印,结果一直为1,出test函数时候生命周期结束(释放内存)。右边图片中的代码中的test函数中变量i在创建后不会销毁 ,重新进入函数后也不会重新创建变量,直接上次累计的数值继续计算。
2024-01-05 13:58:31
1494
1
原创 c语言数组的注意事项
3.c语言规定数组是有下标的,下标从0开始,n个元素的数组,最后一个元素的下标为n-1,下标相当于数组元素的编号。6.二维数组按照行进行初始化,注意二维数组是一个一维数组的数组,存放一维数组的数组,二维数组的每个元素是一维数组。sizeof()返回的是字符串数组的大小,包括字符串末尾的 null 字符,而不是字符串的长度。如数组int arr[10]={1,2,3,4,5,6,7,8,9,10};2.数组的类型,数组是一种自定义数据类型,去掉数组名留下的就是数组的类型。
2024-01-03 18:12:23
891
1
原创 rand函数、srand函数和time函数的使用
调用rand函数之前要先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数时候的种子,生成的随机数序列会随着种子的变化而变化。其实rand函数是对一个叫“种子”的基准值进行运算生成的随机数,由于rand函数生成随机数的默认种子是1,所以每次运行程序产生的随机数序列是一样的,如果要生成不同的随机数,就需要然种子变化。由于rand函数生成的随机数是伪随机的,伪随机数是通过某种算法生成的随机数,并不是真正的随机数。srand函数不需要频繁调用,一次运行的程序中调用一次即可。
2024-01-01 11:46:39
499
原创 C语言分支和循环注意事项
3.多个运算符不宜连用,i < j < k ,并不是保证变量 j 在 i 和 k 之间,因为运算符是从左往右运算,执行的是如下表达式 ( i < j ) < k ,其中 i < j 返回0或1,最终是 0 或 1与 k 进行比较。对于&&操作符,例如:if(a>=5&&a=5的结果为0时,即使不判断右边操作数a
2023-12-26 16:11:42
1273
1
原创 C语言数据类型和变量注意事项
7.算术操作符是双目操作符,/ 用来完成除法,如果除号两端是整数,执行的是整数除法,结果也是整数,C语言里面的整数除法是整除,只会返回整数部分,丢弃小数部分。各位友友大家好,我是来自某中游211的控制科学与工程专业的研一学生,近期在学习c语言和c++,目标是建立起扎实的编程基础,能够独立开发一些小型项目,并逐步深入了解更高级的编程概念和技术。3.sizeof(类型)或者sizeof 表达式,单位是字节,其中sizeof后边的表达式不真实参与运算,由表达式的类型得出大小,这个占位符的宽度至少为5位。
2023-12-21 21:59:20
1786
原创 C语言常见概念注意事项
4.转义字符 :\?\' 转义为 ' \" 转义为 " \\转义为\ \ddd ddd八进制表示字符 \xdd dd字符十六进制表示。5./* */这个注释不支持嵌套注释,注释不能放在双引号里面,双引号里面注释符号会解释为普通符号,失去注释作用。3.%c对单个字符进行打印,%s对字符串进行打印,注意:在字符串的末尾隐藏放着一个\0字符,\0字符对应字符串结束标志。1.main函数是程序的入口,程序是main函数的第一行开始执行的,有且仅有一个。
2023-12-19 14:44:19
388
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人