C++刷题一些经验知识积累

背景:刷选择题时候,有些大佬的解答挺优秀的,收集一下,便人便己。

1、关于对象继承之间的转换。20201101
答:转换指的是通过改变一个变量的类型为别的类型,从而改变该变量的表示方式。
C++标准定义了四个新的转换符:reinterpret_cast、static_cast、dynamic_cast和const_cast,目的是控制类(class)之间的类型转换。
1)reinterpret_cast:用来处理无关类型之间的转换,例如整数与指针相互转换。

2)static_cast:可以用于类层次结构中基类和子类之间的指针或引用的转换。把子类的指针或引用转为基类是安全的,但把基类的转换为子类却是不安全的,原因在于缺少动态类型检测。

3)dynamic_cast:基类和子类的动态类型转换的使用转换符,当用于多态的类型转换时,允许隐式转换和相反操作,同时其会检测操作有效性。

4)const_cast:用来修改类型的const或volatile属性,具体来说,其可以操纵对象的const属性,设置或者移动该属性。

2、C++中多线程里面的原子操作特点。20201102
答:多线程时,原子操作不需要同步。需要同步的目的是避免操作过程中被其他线程打断,原子操作一步到位的,不存在被其他进程打断的可能性,所以不需要同步。
比如,多线程多int型变量x的操作,x=1是原子操作,不需要同步;而++x、x=y、x++,都是经过取值、再赋值的两阶段的,不属于原子操作,因此需要同步。

3、C++中惯用法,IMPL、RALL理解。20201102
答:
1)IMPL,是C++中的桥接设计模式,主要为了隐藏数据以及减轻编译时的压力,通常的做法是另外定义一个新的类,其接口和原来的类一致,但是其数据全部隐藏再新的类中。如,定义A类,定义一个新类B和它有相同接口,其数据成员都在新类中。引用A类代码就不需要重新编译了。

2)RALL,管理有限资源的。RALL仅需要少量的管理代码(针对类而不是对象),能普遍适用于各种资源对象的使用,时间上可以控制和预测,能为资源管理提供一个统一的模式。

3、内联函数使用注意事项。20201102
答:
1)递归函数不能定义为内联函数;
2)一般适用于不存在while和switch等复杂的结构且只有1~5条语句的小函数上,否则编译系统将该函数视为普通函数;
3)内两函数需要先定义再使用的,否则系统也会认为它是普通函数
4)对内联函数不能进行异常的接口说明。

4、关于类的sizeof一些计算考虑。20201102
答:空类,sizeof为1(这跟有没有构造函数无关系),但是如果往空类里面仅添加一个虚函数(不添加其他的变量或者函数),由于需要的一个指针指向该虚函数表,所以至增加一个指针大小,具体大小根据系统而定。

20201109
5、类的特征,三大基本元素、五大基本原则。
答:
1)三大基本元素:封装、继承、多态。
2)五大基本准则:
a、单一职责原则:一个类,最好只做一件事情。单一原则可以看作低耦合、高内聚在面向对象原则上的引申。

扫描二维码关注公众号,回复: 13027731 查看本文章

b、开放闭合原则:软件实体应该是可拓展的,而不可修改的。也就是对拓展开发,对修改封闭。

c、Liskov替换原则:子类必须能够替换其基类。只有子类能够替换基类时,才能保证系统在运行期间识别子类,这是保证继承复用的基础。

d、依赖倒置原则:具体而言,高级模块不依赖于底层模块,两者都是依赖抽象;抽象不依赖具体,具体依赖于抽象。

e、接口隔离原则:使用多个小的专门的接口,而不要使用一个大的总接口。

6、动态类型语言、静态类型语言。
答:
1)动态类型语言:指的是运行期间才去做数据类型检查的语言。也就是说,在用动态类型的语言编程时,永远不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。
2)静态类型语言与动态类型语言相反,它的数据类型是在编译期间检查的,也就是说,在写程序时候需要声明所有变量的数据类型。
C/C++、C#、JAVA都是静态类型的代表。

7、循环体中的break,continue。
答:
1)break,指的是跳出整个循环体,一般跳出多次循环;
2)continue,指的是跳出本次循环,执行循环体中下一次循环,只是跳出单次循环。

20201110
8、一些静态类、非静态类、内外部访问性质。
答:
静态内部类不可以直接访问外围类的非静态数据,可以访问外围类的静态数据;而非静态内部类可以直接访问外围类数据,包括私有数据。
外围类,内部类,指的是一个类里面,成员里面也有一个类,前一个类为外围类,而被包含的称为内部类。

9、List、Set、Map关于接口问题。
答:List、Set等集合对象都继承Collection接口;Map是一个顶层接口,级别和Collection一样。

10、关于main函数的形参。
答:第一个形参是一个整型变量,第二个形参是一个指针数组,其元素指向字符型数据。

11、null的一些特性。
答:null表示没有地址;null可以赋值给引用变量,不能将null赋值给基本类型变量,例如int,double,float,boolean.

12、静态成员数据 可以在类内定义,但 静态成员函数 只能在类外定义。

13、静态成员函数没有this指针的原因。
答:
1)静态成员函数并不是针对类的某个实例对象,而是属于整个类的,为所有对象实例共有的,作用域范围是全局的,独立于类的对象之外的。
2)this指针是相当于一个类的实例指针,是用来操作对象实例的内容的。
3)静态成员函数既然独立于类的实例对象之外,那么,this指针就不能操作静态成员函数了。

20201111
14、对于定义语句:char a=’\82’; 求a的值?
答:a=2;有\表示的是转义字符,但是后面的8,那么这里不能视为xxx进制了。这时候,应该考虑,从右到左根据a的的类型截取相应的字符给a,这里a是char型,所以,截取了一个2给a。或者简单理解,赋值是从右到左顺序的。

15、引用和指针的异同点是啥?
答:
A相同点:
1)、都是地址的概念;
2)指针指向的是一块内存,它的内容是所指向内存的地址;引用时某块内存的别名。

B、区别:
1)指针是一个实体,而引用仅是个别名;
2)引用使用时无须解引用(*),而指针需要;
3)引用只能在定义时被初始化一次,之后不可变(注意,一定要有被引用的量才能初始化引用);指针可变。
4)引用没有const,指针有const;
5)引用不能为空,指针可以为空;
6)"sizeof引用"得到的是所指向变量(对象)的大小,而“sizeof指针”得到的是指针本身的大小;
7)指针和引用的自增(++)运算意义不一样,指针自增表示内存上的后移一位,而引用则是被引用对象的数值加1;如:int a=0; int b=&a;int *p=&a;
b++,表示a++,数值为1;而p++,则表示p指向a后面的内存。
8)从内存上看,程序会为指针分配内存区域,而引用不需要分配。

20201112
16、strcmp(a,b)函数怎么理解?
答:
对两个字符串从左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或者‘\0’为止。如果全部字符相同,则认为相等;若出现不相同的字符或者有的结束了,有点没结束,那么,可以认为不相等。

17、异质链表定义是什么?怎么理解?
答:
1)(一般的链表中的结点类型都是相同的)链表中,结点或者对象不全是同一类型,这种链表就叫异质链表;
2)先思考一下,如果将不同类型的对象使用链表直接链接,显然不好操作(不能使用for操作),换个思路,可以抽象这些对象的共同点,将这些共同点构造成结点,然后把这些结点串联起来,并且需要保证,通过这些结点,可以访问到对应的对象,也就是用抽象类指针构造派生类对象链表。

18、从源码到机器可识别的代码的过程(.cpp->.exe)。
答:
源代码->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件

20201113
19、八进制和十六进制的转义字符表示是怎么样的?
答:
\0dd表示8进制,d取值0~8;
\xhh表示16进制,h取值0~f。

20、操作符优先级是怎么样的?
答:参考https://www.cnblogs.com/home123/p/7519655.html
在这里插入图片描述
在这里插入图片描述
21、常见的转义字符是啥?
答:参考https://www.cnblogs.com/seer/archive/2013/06/08/3127055.html
\a 响铃
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\ 反斜杠
\? 问号字符
\ ’ 单引号字符
\ " 双引号字符
\0 空字符(NULL)
\ddd 任意字符
\xdd 任意字符

20201118
22、内联函数的开始起作用时间点是?
答:其再编译时将函数体嵌入每一个调用处,类似编译时宏定义的作用。(要注意,内联函数不是在调用时控制转移的)
此外,内联函数,适用于小函数(1-5行),并且频繁调用的。

23、&(与运算)、|(或运算)、^(异或运算)怎么理解?
答:
1)&运算:相当于十进制 相同位做加法的1/2
0101 & 0011 结果:二进制0001 十进制 (2 ^ 0 +2 ^ 0) / 2 这里的"^"代表次幂

2)|运算:相当于十进制 相同位做加法的1/2与不同位做加法求和
0101 | 0011 结果:二进制0111 十进制 (2 ^ 0 +2 ^ 0)/2 +(2^ 2 +2^1)

3)^运算:相当于十进制不同位做加法
0101 ^ 0011 结果:二进制0110 十进制(2^ 2 + 2^1 )

个人理解的是:把二进制数位置写好:&的话,相同取1,否则为0;|的话,只要有1就取1,两个0才0;^的话,相同取0,否则取1。
验证小程序:

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;

int main()
{
    
    
	int m = 123, n = 21;
	char t[10];
	_itoa_s(m, t, 2);
	printf("m二进制:%s\n", t);
	_itoa_s(n, t, 2);
	printf("n二进制:%s\n", t);

	printf("m&n:%d\n", m & n);
	printf("m|n:%d\n", m | n);
	printf("m^n:%d\n", m ^ n);
	system("pause");
	return 0;
}

参考:https://blog.csdn.net/weixin_41074793/article/details/84943410

20201120
24、final关键字的含义?
答:final修饰变量的本质是,修饰的变量值(地址或内容)无法改变。如果修饰的是引用,则地址不可改变,其地址上的内容还是可以改变的;如果修饰的是变量,那么变量的值就不能修改了。

20201125
25、关于structs框架有?
答:
1)structs可以进行文件上传;
2)structs基于MVC模式,MVC是模型,视图,控制器,是一种设计模式;
3)structs框架可以让流程结构更清晰;
4)structs需要很多action类,会增加文件数目。

26、类中有成员是静态变量注意点。
答:
1)该静态变量不能通过this来访问;
2)该静态变量可以通过 类名+. 来访问。

27、栈和堆运行小知识。
答:
1)栈内存如果没有初始化,会出现“烫烫烫”;
2)堆内存如果没有初始化,会出现“屯屯屯”。

20201128
28、逗号表达式特性。
答:如果有 a=表达式1,表达式2,…,表达式n,那么,a的最后结果为 表达式n。

29、while,for条件判断注意点。
答:
当条件判断为赋值语句时,如while(x=y),for(;x=y;),如果赋值非0,则条件都是1,循环体会执行;但,当赋值为0时,表示终止,循环体不会执行。

20201202
30、关键字super
答:
1)子类构造函数调用父类构造函数需要使用super;
2)子类重写父类方法后,若想调用父类被重写的方法,需要使用super;注意,未被重写的方法可以直接调用。

############################
大都是整理源自牛客网刷题过程中,感谢原答疑者提供解答~
不积硅步,无以至千里

猜你喜欢

转载自blog.csdn.net/qq_45701501/article/details/109411308