牛客刷题2-国庆期间

学习内容:

一面:
1.解释多态,虚函数表
   多态分为静态多态和动态多态,先说简单的静态,就是一个函数可以有多种表现形态,比如同样定义了一个sum函数,在一个类中我先后定义了sum(int a,int b),sum(int a),那么在我们调用函数的时候,就会根据具体情况选择执行。
    动态就是常说的虚函数,子类可以继承父类,二者函数名相同,编译器根据具体情况调用父子函数,这其中也会有接口重写的概念,当定义为纯虚函数时,子类会对函数就行重写。
   虚函数表是父子类中都会存在的(如果二者都定义了虚函数),当二者定义了虚函数时,当定义一个父类指针指向子类时,会根据父类的虚函数表找到子类,调用子类中的函数。
   通过基类对象的指针或者引用调用虚函数。虚函数表中存储了指向函数的指针,对象的虚表指针用来指向自己所属类的虚表,虚表中的指针会指向其继承的最近的一个类的虚函数。我们声明一个父类 的指针p来指向子类对象,结果回调用子类的函数。
   我们把经过虚表调用虚函数的过程称为动态绑定,其表现出来的现象称为运行时多态。动态绑定区别于传统的函数调用,传统的函数调用我们称之为静态绑定,即函数的调用在编译阶段就可以确定下来了。

    那么,什么时候会执行函数的动态绑定?这需要符合以下三个条件。
   通过指针来调用函数
   指针 upcast 向上转型(继承类向基类的转换称为 upcast
调用的是虚函数
这里解释一下为啥析构函数要设置成虚函数,因为设置了之后,声明父类对象指针指向子类对象时,通过虚函数表就可以调用子类函数,相应的 子类会被析构掉。
2.类的空指针调用函数(this指针)
   声明一个类A的指针时nullptr,用这个指针调用不会出错,是因为指针时类所独有的,这个类的全部对象都是使用这个指针,不需要去指向一个特定对象。对于类成员函数而言,并不是一个对象对应一个单独的成员函数体,而是此类的所有对象共用这个成员函数体。 当程序被编译之后,此成员函数地址即已确定。当调用p->func1(); 这句话时,其实就是调用A::func1(this);而成员函数的地址在编译时就已经确定, 需要注意的是,你用空指针调用成员函数,只是让this指针指向了空,所以空指针也是可以调用普通成员函数,只不过此时的this指针指向空而已
3.子函数中malloc分配
只有两种方法能正确分配内存。即直接返回内存指针,或将二级指针作为参数传入子函数。这是因为,在子函数中,内存指针只是被当做一个变量来处理的(虽然这个变量被定义为dataStc *),对其赋值后再返回,它的值当然没改变。

4.不能继承的类(不能用final)
将这个类的构造函数或者析构函数声明为私有。
可以通过定义公有的静态函数来创建和释放类的实例,这样,该类不能被继承但是可以被实例化。
sizeof是在编译的时候就将结果计算出来了是类型所占空间的字节数,所以以数组名做参数时计算的是整个数组的大小。而strlen是在运行的时候才开始计算结果,这是计算的结果不再是类型所占内存的大小,数组名就退化为指针了。
5.new失败

6.sizeof,strlen,指针退化
sizeof是运算符,可以以类型、函数、做参数 。strlen是函数,只能以char*(字符串)做参数。而且,要想得到的结果正确必须包含 ‘\0’(通过strlen的实现得知)。
7.memcmp比较结构体
memcmp(*str1,*str2.n) 比较两块内存块大小,前n个字节,
这里不管内存存的是什么,都可以比较,字符可以化成ASCII码值进行比较。
比较结构体会有错误,因为根据计算机系统的字节对齐原则,即使两个结构体内部赋值一模一样,也会出错。因为为了对齐而添加的内存块,有可能不同。
8.fork返回值
子进程返回0
父进程返回PID
9.端口占用查看
输入命令:netstat -ano,列出所有端口的情况。在列表中我们观察被占用的端口,比如是49157,首先找到它。
查某个端口被占用情况 netstat -aon|findstr “49157”

你可能感兴趣的:(实习)