- 博客(53)
- 收藏
- 关注
原创 C++笔试强训10
a是const int类型的,&a就是const int*类型的,此处强转成int*类型赋值给p,然后通过p修改了值为20,然后打印出a的值和*p的值。在主流编译器中空类的大小一般都是1,如果空类的大小为0的话,比如说类A创建了三个对象a、b、c,那在内存上,这三对象不就在同一个内存位置了嘛?const成员函数,const加在函数名()的后面,此处的const实际上修饰的是this指针,表明在该成员函数中,不能修改非静态的成员变量。故会先初始化a,后初始化b,和初始化列表中a,b的顺序无关,故会输出ab。
2024-07-31 12:16:20
760
原创 C++笔试强训9
本题中就是没有配对使用导致的问题,new class A[5]会调用5次构造函数,但在释放的时候应该使用delete[] pclassa才对,这里使用的是delete pclassa会导致未定义行为,题目不太严谨,此处应该给出出现未定义行为才对,不过如果非要选一个的话,那就是析构了一次,因为。C++中的静态数据成员是类的成员,但它不是类的任何特定对象的实例的一部分。A:将构造函数设为私有,new都创建不了,因为new一个对象的时候会调用该对象的构造函数,现在构造函数私有的,就不能创建了,故A错。
2024-07-28 18:38:47
775
原创 C++笔试强训8
本题让补充一个构造函数,成员变量是一个int类型的指针p,然后调用show函数返回*p之后是个5,说明我们要给p来new一块内存,并把5存进去,p=new int(x)符合题意,故选B。类里有个静态成员变量,构造函数中++了一次,析构函数中–的一次,故值不变,又因为静态成员变量是属于类的,故对象释放该静态成员变量依旧存在,故值不变还是0‘故选D。概念:是一个特殊的构造函数,是单参的,参数类型必须是类类型的引用,一般情况下会使用const来修饰例如: A(const A& a),指针可以改变所指对象,正确。
2024-07-25 18:16:42
1009
原创 C++笔试强训7
这意味着编译器会尝试将函数的代码直接插入到每个调用该函数的地方,而不是像通常那样进行函数调用(即,生成调用指令,跳转到函数代码,执行函数体,然后返回)。友元函数是在类外部定义的普通函数,它只能通过传入的参数(如果有的话)来访问类的成员,或者通过类的对象显式地访问(如果该函数设计为接受类的对象作为参数)。函数参数默认值又叫缺省参数,缺省参数必须从右向左开始缺省,必须连续给定缺省值,也就是说,从左到右,一旦遇到一个参数是缺省的,那么之后的参数也必须都是缺省的。指针是类成员函数特有的,用于指向调用该函数的对象。
2024-07-21 22:06:29
998
2
原创 套接字编程一(简单的UDP网络程序)
其中netstat命令显示的信息中,Proto表示协议的类型,Recv-Q表示网络接收队列,Send-Q表示网络发送队列,Local Address表示本地地址,Foreign Address表示外部地址,State表示当前的状态,PID表示该进程的进程ID,Program name表示该进程的程序名称。bind需要传三个参数,第一个是套接字sockfd,第二个是一个sockaddr*,前面我们讲过,这里传参的实际上还是sockaddr_in这个结构体,只不过是传参的时候要强转成sockaddr*而已。
2024-07-21 13:54:35
1269
原创 C++笔试强训6
当然这里我们默认规定的是右边的比左边的大,即height[right]>height[left],结果是算一次后直接right++就行,如果是左边的比右边的大的话,即height[left]>height[right],这不是和前一种情况思路类似嘛,算一次后后面的就全不用算了,直接left–跳过这个边界,判断下一个边界就行了。◦ 如果改变右边界,无论右边界移动到哪里,新的水面的高度一定不会超过左边界,也就是不会超过现在的水面高度,但是由于容器的宽度减小,因此容器的容积一定会变小的。
2024-07-20 17:26:43
903
原创 C++笔试强训5
如果某个函数在当前文件中被调用但没有定义(且没有提供函数声明,除非使用了隐式声明,但现代C语言编程通常不推荐),编译器可能会报错或发出警告,但通常这些警告/错误只涉及当前文件,并不会检查该函数是否在项目的其他部分被定义。基础,a[i]相当于*(a+i),a[i][j]相当于*(*(a+i)+j),a[i][j][k]相当于*(*(*(a+i)+j)+k).p[0][0]就是10,*(p[0]+1)相当于p[0][1]是20,(*p)[2]相当于p[0][2],就是30。是发现被调用的函数未定义的阶段。
2024-07-14 21:56:51
884
原创 C++笔试强训4
a是数组名,&a表示数组的地址,&a+1表示指针偏移一个数组的大小,即5个int大小的字节数,因此&a+1指向数组最后一个元素的下一个元素,在强转为int*,进行±操作移动的步长就会改变成一个int大小,因此,p-1指向元素9,*(p-1)就是9。%o就是输出八进制的无符号数,0123,,以0开头·,本来就是八进制,所以输出为123,123是十进制,转化为八进制就是173.知识点,数组名是数组首元素的地址,&数组名是数组的地址,相同点,都指向同一个位置,不同点±操作移动的步长不一样。
2024-07-13 21:10:46
1115
原创 C++笔试强训2
(4)是指针常量,不能修改指针的指向的地址,但可以修改指向的数据。(b+2)=2,表示指针先向后偏移两个单位(两个int类型的字节数即8个字节)指向下标为2的内个元素(下标从0开始算),然后赋值成了2即变成了3,2,2,4.b++,即b指向下一个元素即下标为1的元素。a是数组名,单纯一个a是数组首元素的地址,&a的话是数组的地址,虽然指向的位置和a指向的位置一样,但区别在进行±运算的时候移动的步长不一样。常量指针指的是通过该指针不能修改它所指向的数据,但是指针的值(即它所指向的地址)是可以被修改的。
2024-07-06 22:37:42
806
2
原创 Linux线程安全,互斥量和条件变量
因此第二次申请锁失败之后这个线程就会被挂起,但是它是拿着锁被挂起的,因为被挂起了,所以就没办法释放锁,也就不会被唤醒,因此该执行流就处于一种死锁的状态了。由于–需要三条汇编指令才能完成,所以有可能线程1即thread1在执行完load 指令将共享变量ticket(1000)从内存加载到寄存器中之后就被切换了,此时thread1读到的数据是1000,当thread1被切换之后,寄存器中的数据会被当成thread1的上下文数据被保存起来,等到thread1被切回来的时候,再次恢复上下文。
2024-05-05 13:20:35
1174
原创 C++智能指针
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。// 1.内存申请了忘记释放// 2.异常安全问题Func();// 这里Func函数抛异常导致 delete[] p3未执行,p3没被释放.
2024-04-10 13:16:05
1145
原创 C++lambda表达式
随着C++语法的发展,**人们开始觉得上面的写法太复杂了,每次为了实现一个algorithm算法, 都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便。上面由于在编写仿函数的时候我们取的名字比较好,一看仿函数的名字就知道这个仿函数的作用,但是有没有一种可能,别的程序员在写的时候不好好取名字,直接写个compare1、compare2,然后让你来阅读他的代码,那岂不是很难受吗?上面的仿函数我们可以利用lambda表达式做这样的修改。
2024-04-08 12:25:11
997
原创 MySQL数据类型
MySQL本身是不支持bool类型的,当把一个数据设置成bool类型时,数据库会自动将其转换成tinyint(1)的数据类型,其实这个就是变相的bool类型,因为tinyint(1)只有1和0两种取值,可以分别对应bool类型的true和false。还是上面内个例子,我们插入99.994是可以插入的,因为更具四舍五入原则,直接把最后的4舍弃了,所以插入的就是99.99.但是如果这里插入的是99.995的话,那就插入失败了,因为5会进一位,就导致整数部分成100了,这显然就超过范围了,就会报错,不让插入。
2024-03-30 21:10:04
2943
原创 MySQL表的操作
我们以前的文章中说过,在Linux中MySQL创建数据库的本质就是在Linux中创建了一个文件,我们上面创建了一个叫test_1的数据库,因此我们可以进入到这个test_1的目录下,可以发现多了三个文件。在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型,表的存储引擎等等。这时我们就需要修改表。我们这里可以看到默认是InnoDB的存储引擎,在建表的时候如果没有指定采用什么存储引擎,那就会使用默认的。在修改表之前,我们先插入几个数据,方便让大家看到修改后的变化。
2024-03-24 17:00:01
1357
原创 C++vector的模拟实现
假如这里有两个string类对象A和B,使用memcpy将B拷贝到A中去,因为它会原封不动的进行拷贝,所以会导致A中的指针和B中的指针指向同一块空间,在A进行释放指针指向的空间的时候就会导致B中的空间也会被释放。调用这个函数需要传入一个迭代器区间,由于你传入的迭代器不知道是string的迭代器,还是list的迭代器,还是谁谁谁的迭代器,类型不确定,所以我们这里要弄成模板,让编译器去自己推导。来实现的,可是在调用之前_start已经修改为tmp了,由此计算出来的size就一定有问题,所以我们这里不能在。
2024-03-11 20:19:36
857
原创 C&C++内存管理【非常详细,对新手友好】
介绍C&C++内存布局,介绍堆栈概念与区别,介绍new,delete底层原理,介绍内存泄漏等等。
2024-01-27 16:11:18
2216
5
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人