记录一些零碎,里面有助于理解的是从各处找来的:)
1.【C++】下面代码执行的输出结果
class BASE{
public:
~BASE()
{
cout<<"BASE";
}
};
class DERIVE:public BASE{
public:
~DERIVE()
{
cout<<"DERIVE";
}
};
void main()
{
DERIVE x;
}
【答案及解析】输出结果为“DERIVEBASE”,派生类的析构函数的调用顺序
【参考】C++:派生类的构造函数和析构函数的调用顺序(非常详细,感激不尽:))
2.【C++】下面代码执行的输出结果
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* str6 = "abc";
bool res1 = str1==str2?1:0;
bool res2 = str3==str4?1:0;
bool res3 = str5==str6?1:0;
cout<<res1<<res2<<res3<<endl;
【答案及解析】结果为“001”,“==”符号比较的是两个字符串的地址是否相等,str1和str2是两个char型数组的名字,也是数组首元素的地址,所以不等;(不懂,谁能帮我解答下这个)
【参考】【C/C++】对char* 和 char[]区别的一些理解
3.【C++】下面代码执行的输出结果
static int hot = 200;
int &rad = hot;
hot+=100;
cout<<rad<<endl;
【答案及解析】结果为300,rad为hot的引用
4.【C++】函数重载的条件:参数列表不同才能实现重载,包括以下两点:参数个数不同和参数类型不同
5.【C++】public、protect、private继承
public继承:派生类可以访问基类的public、protect
派生类的对象可以访问派生类的public、基类的public
protect继承:基类的public、protect被派生类继承后变成protect,派生类的新增成员可以访问基类的public、protect
派生类的对象不能访问派生类继承基类所有
private继承:基类的公有public、protect都被派生类继承后变成private,派生类的新增成员可以访问基类的public、protect
派生类的对象不能访问派生类继承基类的所有
6.【C++】多态分类及实现:
重载多态(编译期):函数重载、运算符重载
子类型多态(运行期):虚函数
参数多态性(编译期):类模板、函数模板
强制多态(编译期\运行期):基本类型转换、自定义类型转换
7.【C++】派生类中的虚函数:
虚函数必须要在基类用virtual修饰才能为虚函数,之后的继承层次结构中都是虚函数,不管它在有没有再次声明是不是虚函数
8.【其他】文本加密:
MD5、SHA摘要算法,是不可逆的,所以不能用于文本加密,DES和RC4是对称加密,RSA是不对称加密,都可以用于文本加密
9.【操作系统】Cache的平均存取时间公式
平均访存时间 = 命中时间+失效率×失效开销。
三级Cache的平均访问时间的公式,只有第I层失效时才会访问第I+1。设三级Cache的命中率分别为HL1、 Hl2、 HL3,失效率分别为Ml1、Ml2、ML3,第三级Cache的失效开销为PL3。
平均访问时间TA =HL1+Ml1{Hl2+Ml2(HL3+ML3×PL3)}
10.【数据库】一个表只能有一个聚集索引和多个非聚集索引(聚集索引和非聚集索引(整理))
11.【C++】__cdecl __fastcall与__stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法。(_cdecl允许调用者传递不确定数量的参数,pascal, fastcal 返回方式和 stdcall相同)
1)__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈。
2)_cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用3)_stdcall函数的大。函数采用从右到左的压栈方式。注意:对于可变参数的成员函数,始终使用__cdecl的转换方式。
4)__fastcall调用约定:它是通过寄存器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈)。
5)thiscall仅仅应用于"C++"成员函数。this指针存放于CX寄存器,参数从右到左压。thiscall不是关键词,因此不能被程序员指定。
6)nakedcall采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。naked call不产生这样的代码。naked call不是类型修饰符,故必须和_declspec共同使用。
12:【操作系统】Windows 下进程和线程
1)一个进程至少有一个线程,线程作为调度的基本单位;2)线程共享父进程申请到的内存空间,但并不代表,共享父进程的栈空间。3)线程必须从属于一个进程,并且是不可变更的;4)线程被创建后,其从属的进程是确定不变的。 5)主线程改变会影响到其他线程;6)线程之间可以直接通信,但是进程之间必须通过IPC;7)多进程中每一个进程都拥有自己的地址空间,而线程都共享同一个地址空间。
13.【C++】动态链接库dll的共享部分包括代码段和外部定义的引用
14.【数据库】数据库join
内连接返回的结果集是两个表中所有相匹配的数据,不包含没有匹配的行。
外连接有三种:左外连接,右外连接,全外连接。外连接不仅包含符合连接条件的行,还包含左表(左外连接)、右表(右外连接)或两个表(全外连接)中的所有数据行。对于没有匹配的行就用NULL值来填充。
15.【正则】正则表达式:\w匹配任何字类字符,包括下划线,但是不包括'.'
16.【C++】const
const左边的是不变的东西,唯一的例外就是const本身就是最左边的修饰符,那么它才会对右边的东西起作用
int const 等价于 const int ,两个可互换(紧贴着),表示常量
const数据成员只能在构造函数的初始化列表中初始化;
17.【其他】n 次可以测出来 3^n 以内的假冒伪劣,至于怎么测,方法都一样,平均分成三墩
18.【其他】n 个字符构成的字符串,假设每个字符都不一样,字符串的子串,就是字符串中的某一个连续片段。截取一个字符串长度需要一个起始位置和结束位置,c(n+1,2)+1(空串)
19.【其他】计算N!下三进制结果末尾有多少个0,其实就是计算三进制中的3被进位多少次,只要将N!因式分解成3^m*other,m就是答案。技巧性的解法就是m=N/3+N/(3^2)+N/(3^3)….+N(3^k) (k<=N/3)
20.【操作系统】关于Linux文件系统的inode描述错误的是: A inode和文件是一一对应的(一般情况下,文件名和inode号码是"一一对应"
关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码)
21.【操作系统】进程有3个状态:就绪态。执行态、阻塞态。
三种状态的转换包含有: 就绪->执行,执行->就绪,执行->阻塞,阻塞->就绪
等待I/O、进程sleep、等待解锁等原因都会导致进程暂停。关于"时间片切换",当进程已经获得了除cpu外所有的资源,这时的状态就是就绪态,当分配到了时间 片就成了执行态,当时间片用完之前一直未进入阻塞态的话,此后便继续进入就绪态。所以进程的就绪与阻塞是完全不同的
22.【操作系统】减少换页错误的方法,即降低缺页中断率:
1、内存页框数。增加作业分得的内存块数。
2、页面大小。页面划分越大,中断率越低。
3、替换算法的优劣影响缺页中断次数
4、程序局部性。(局部性原理是一个经典的原理,分为时间局部性和空间局部性,意思是应用一旦访问了一个空间的数据,则这个空间中的相邻区域的内容也很可能被访问,一旦访问了某一段代码,则其周围的代码也很可能被访问。局部性原理的运用就是根据这个,把可能访问的数据和代码都加在到内存中,以后访问就不用加载了(因为主要的消耗在IO端)。这也是迪杰斯特拉提出的goto语句有害的依据,应为goto语句能打破局部性原理,造成计算机的延迟加剧。)
23.【数据库】WHERE 子句不能包含聚集函数
select paper_id from myscore group by paper_id having avg(score) < 90
24.【C++】c++类的大小计算
25.【linux】linux文件权限长10位,分四段:1)是指文件类型2)是指拥有者读写权限3)所属组成员滴血权限4)其他用户权限(Linux文件权限一共10位长度,分成四段,每段的含义)