考研复试问答题复习总结(四)

(2020科软复试一本通中的要点)

C++相关知识:

1、什么是多态?静态多态和动态多态有什么区别?

答:多态是允许将父类对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作

为什么要使用多态?
可替换性:多态对已存在的代码具有可替换性
可扩充性:增加新的子类并不影响已存在类的多态性、继承性以及其他特性的运行和操作
接口性:多态是父类(超类)通过方法签名,向子类提供了共同的接口,子类可以通过覆写完善或者覆盖这个接口。
灵活性:在应用中体现了灵活多样的操作,提高了使用效率。

静态多态:静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数。
动态多态:动态多态则是利用虚函数实现了运行时的多态,也就是说在系统编译的时候并不知道程序将要调用哪一个函数,只有在运行到这里的时候才能确定接下来会跳转到哪一个函数的栈帧。

具体区别:参考https://blog.csdn.net/stay_the_course/article/details/55259801?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

3、输入输出格式控制的方法有哪些?

使用控制符控制输出格式:#include <iomanip> 例:

  • cout<<"dec:"<<dec<<a<<endl; //以十进制形式输出整数
  • cout<<"hex:"<<hex<<a<<endl; //以十六进制形式输出整数a
  • cout<<"oct:"<<setbase(8)<<a<<endl; //以八进制形式输出整数a
  • cout<<setw(10)<<pt<<endl; //指定域宽为,输出字符串
  • cout<<setfill('*')<<setw(10)<<pt<<endl; //指定域宽,输出字符串,空白处以'*'填充

用流对象的成员函数控制输出格式:例:

  • cout.setf(ios::hex); //设置以十六进制输出的状态
  • cout<<"hex:"<<a<<endl; //以十六进制形式输出a
  • cout.unsetf(ios::hex); //终止十六进制的格式设置
  • cout.width(10); //指定域宽为
  • cout.fill('*'); //指定空白处以'*'填充
  • cout<<pt<<endl; //输出字符串

详细参考:https://blog.csdn.net/renchunlin66/article/details/51351757?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158581590919724843349260%2522%252C%2522scm%2522%253A%252220140713.130056874..%2522%257D&request_id=158581590919724843349260&biz_id=0&utm_source=distribute.pc_search_result.none-task

4、什么是动态对象数组?

动态对象数组:分配空间给对象数组,对象数组就是数组里的每个元素存储的都是类的对象,赋值时先定义对象,然后将对象直接赋值给数组。

5、静态成员函数为什么没有this指针?

静态成员函数并不是针对某个类的实例对象,而是属于整个类的,为所有的对象实例所共有。他在作用域的范围内是全局的,独立于类的对象之外的。他只对类内部的静态成员变量做操作。当实例化一个类的对象时候,里面不存在静态成员的。this指针是相当于一个类的实例的指针,this是用来操作对象实例的内容的,既然静态成员函数和变量都是独立于类的实例对象之外的,他就不能用this指针。也不能操作非静态成员。

6、纯虚函数有什么作用?

当不同的子类继承这个父类的时候,定义不同的实现方法,那么实例化这个子类的时候,这个纯虚函数就有了不同的方法。于是这也解释了为什么包含纯虚函数的抽象类为什么不能实例化,因为它中间有函数根本不知道是怎么个实现。
参考:https://blog.csdn.net/sinat_35866463/article/details/79878372

7、抽象类有什么特点?

a.抽象类和抽象方法必须使用abstract修饰
b.抽象类中不一定有抽象方法,但是有抽象方法的类必须定义为抽象类
c.抽象类不能实例化
       因为他不是具体的。
       抽象类具有构造方法,但是不能实例化。构造方法的作用是什么?子类对父类数据进行初始化
d:抽象的的子类
         如果不想重写方法,该子类是一个抽象类
         重写所有的的抽象方法,这时候子类是一个具体的类

8、new和malloc的区别?

(1)malloc和new都是在堆上开辟内存的malloc只负责开辟内存,没有初始化功能,需要用户自己初始化;new不但开辟内存,还可以进行初始化
(2)malloc是函数,开辟内存需要传入字节数,malloc的返回值需要强转成指定类型的地址,malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型;
new是运算符,开辟内存需要指定类型,返回指定类型的地址,因此不需要进行强转,故new是符合类型安全性的操作符。使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。
(3)malloc开辟内存失败返回NULL,new开辟内存失败抛出bad_alloc类型的异常
(4)malloc开辟的内存永远是通过free来释放的;而new单个元素内存,用的是delete,如果new[]数组,用的是delete[]来释放内存的。

9、const修饰的常数据成员,常对象和常成员函数有什么特点?

常数据成员: const 类型说明符 数据成员 如:const int year
常对象:const 类 对象 如: const A a(1,2)
常成员函数:类型说明符 函数名(参数表) const 如:void showDate() const
1.常成员函数可以访问常数据成员,也可访问普通数据成员。
2.常数据成员可以被常成员函数访问,也可被普通成员函数访问。
3.如果将一个对象说明为一个常对象,则通过该对象只能调用它,而不能调用普通的成员函数。
4.常成员函数不能更新对象的数据成员,也不能调用该类中的普通成员函数。
5.常对象和常对象成员只能调用常成员函数
6.普通的对象和对象成员却可以调用普通成员函数和常成员函数

11、vector的特点?

Vector是STL的常见容器之一,vector是表示可变大小数组的序列容器。vector采用的连续存储空间来存储元素。因此,它可以像数组一样用下标对元素进行操作,但它与数组最大的不同就是,它的大小可以改变,并且是自主控制容量的变化。与array相似,但array是静态空间,一旦配置了就不能改变;vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素,比数组高效很多。 Vector 所有的方法都使用了 synchronized 修饰符,即:Vector 线程安全但是性能较低,适用于多线程环境。

12、C++中哪些运算符不能重载?

不能被重载的运算符有:
1.作用域操作符: ::
2.条件操作符: ?:
3.点操作符: .
4.指向成员操作的指针操作符:->* , . *
5.预处理符号:#

原创文章 30 获赞 34 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41950078/article/details/105210236