c/c++ 面试笔试知识点----牛客网(2)

来源:互联网 发布:node 版本切换 编辑:程序博客网 时间:2024/05/22 03:18
26. 
22.c++标准不要求vector<T>::operator[]进行下标越界检查,原因是为了效率,总是强制下标越界检查会增加程序的性能开销。设计vector是用来代替内置数组的,所以效率问题也应该考虑。不过使用operator[]就要自己承担越界风险了。如果需要下标越界检查,请使用at
27. #import是#include的替代指令,防止重复引用
28. 
A:“很多程序员希望STL实现是完全线程安全的“。所以不安全。
B:vector的存在可以使开发者不必关心内存的申请和释放。但是,vector的一个缺点就是它的内存分配是按照2的倍数分配内存的。
C:错误。要知道 std::sort 不是稳定的排序算法,它不保证“相等”元素的相对位置,使用 std::stable_sort 来保证这一点
D:STL的容器可以分为以下几个大类: 
一:序列容器, 有vector, list, deque, string.
: 关联容器,     有set, multiset, map, mulmap, hash_set, hash_map, hash_multiset, hash_multimap
: 其他的杂项: stack, queue, valarray, bitset
E:正确。堆栈是一个线性表,插入删除操作都在一端进行,deque是先进先出的,操作原理和stack是一样的
29. 
函数模板和类模板
函数模板的实例化是由编译程序在处理函数调用时自动完成的
类模板的实例化必须由程序员在程序中显式地指定函数模板针对仅参数类型不同的函数
类模板针对仅数据成员和成员函数类型不同的类
30. 
assert 含义是断言,它是标准C++的cassert头文件中定义的一个宏,用来判断一个条件表达式的值是否为ture,如果不为true, 程序会终止,并且报告出错误,这样就很容易将错误定位 
通常我们开发的程序有2种模式:Debug模式和Release模式
1. 在Debug模式下,编译器会记录很多调试信息,也可以加入很多测试代码,比如加入断言assert, 方便我们程序员测试,以及出现bug时的分析解决
2. Release模式下,就没有上述那些调试信息,而且编译器也会自动优化一些代码,这样生成的程序性能是最优的,但是如果出现问题,就不方便分析测试了
31. 
sizeof一个数组名称的时候是计算的变量所具有的实际的字节数!!
当你在函数A中定义一个数组(比如,char str[15];),然后在该函数A中直接使用sizeof(str),那么输出结果肯定是15;但是当你把这个数组当成参数传递给另一个函数B(假如 函数B为void funB(char newstr[]),在函数B中,再次使用sizeof(newstr),输出的结果则为4,那么这是为什么啊??
原因是把数组作为函数实参传递时,是传地址,或者叫传引用,这样只是把函数A中数组str的首地址传递到函数B,赋值给newstr,此时newstr仅仅是一个指针,保存的是数组str的首地址,所以newstr这个指针变量就是占4个字节的内存。
32. 
C++ Primer P211,一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值。
33. 
clock()就是该程序从启动到函数调用占用CPU的时间 
time( &t );为获取系统时间 
localtime(&t);  将一个UTC时间转为本地时间 
34. 
函数模板必须由程序员实例化为可执行的函数模板
一个类定义中,只要有一个函数模板,则这个类是类模板
类模板的成员函数都是函数模板,类模板实例化后,成员函数也随之实例化
A函数模板必须由编译器根据程序员的调用类型实例化为可执行的函数 
C类模板的成员函数都是函数模板 
D没使用过的成员函数(即函数模板)不会被实例化
 
35. 
 
指针常量:const*左侧表示指针指向常量
常量指针:const*右侧,指针本身就是一个常量
36. 
c++程序中,类里面的数据成员加上mutable后,修饰为const的成员变量,就可以修改它。
37. 
静态变量是存放在全局数据区,而sizeof计算栈中分配的大小,是不会计算在内的。
38. 
不能重载的运算符
    * sizeof运算符
    * :: 作用域解析运算符
    * ?: 条件运算符
    * .  直接成员运算符
    * .* 成员指针运算符
    * tpeid
    * const_cast
    * dynamstic_cast
    * reinterpret_cast
    * static_cast
只能通过成员函数进行重载
    * = 赋值运算符
    * () 函数调用运算符
    * [] 下标
    * -> 间接成员运算符
 
39. 
1. /var/log/messages —包括整体系统信息,其中也包含系统启动期间的日志。此外,mailcrondaemonkernauth等内容也记录在var/log/messages日志中。
2. /var/log/dmesg —包含内核缓冲信息(kernel ring buffer)。在系统启动时,会在屏幕上显示许多与硬件有关的信息。可以用dmesg查看它们。
3. /var/log/auth.log —包含系统授权信息,包括用户登录和使用的权限机制等。
4. /var/log/boot.log —包含系统启动时的日志。
5. /var/log/daemon.log —包含各种系统后台守护进程日志信息。
6. /var/log/dpkg.log 包括安装或dpkg命令清除软件包的日志。
7. /var/log/kern.log 包含内核产生的日志,有助于在定制内核时解决问题。
8. /var/log/lastlog —记录所有用户的最近信息。这不是一个ASCII文件,因此需要用lastlog命令查看内容。
9. /var/log/maillog /var/log/mail.log —包含来着系统运行电子邮件服务器的日志信息。例如,sendmail日志信息就全部送到这个文件中。
10. /var/log/user.log —记录所有等级用户信息的日志。
11. /var/log/Xorg.x.log —来自X的日志信息。
12. /var/log/alternatives.log 更新替代信息都记录在这个文件中。
13. /var/log/btmp 记录所有失败登录信息。使用last命令可以查看btmp文件。例如,”last -f /var/log/btmp | more“
14. /var/log/cups —涉及所有打印信息的日志。
15. /var/log/anaconda.log —在安装Linux时,所有安装信息都储存在这个文件中。
16. /var/log/yum.log —包含使用yum安装的软件包信息。
17. /var/log/cron —每当cron进程开始一个工作时,就会将相关信息记录在这个文件中。
18. /var/log/secure —包含验证和授权方面信息。例如,sshd会将所有信息记录(其中包括失败登录)在这里。
19. /var/log/wtmp/var/log/utmp —包含登录信息。使用wtmp可以找出谁正在登陆进入系统,谁使用命令显示这个文件或信息等。
20. /var/log/faillog –包含用户登录失败信息。此外,错误登录命令也会记录在本文件中。
除了上述Log文件以外,/var/log还基于系统的具体应用包含以下一些子目录:
· /var/log/httpd//var/log/apache2 —包含服务器access_logerror_log信息。
· /var/log/lighttpd/ —包含light HTTPDaccess_logerror_log
· /var/log/mail/ – 这个子目录包含邮件服务器的额外日志。
· /var/log/prelink/ —包含.so文件被prelink修改的信息。
· /var/log/audit/ —包含被 Linux audit daemon储存的信息。
· /var/log/samba/ –包含由samba存储的信息。
· /var/log/sa/ —包含每日由sysstat软件包收集的sar文件。
· /var/log/sssd/ –用于守护进程安全服务。
40. 
string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()无关。   
sizeof(string)=4可能是最典型的实现之一,不过也有sizeof()1232字节的库实现。 但是VC6.0测试后sizeof(string)=16.还是跟编译器有关
41. 
计算一个类对象的大小时的规律:
    1、空类、单一继承的空类、多重继承的空类所占空间大小为:1(字节,下同);
    2、一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的;因此一个对象的大小所有非静态成员大小的总和;
    4、当类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针vPtr指向虚函数表VTable
    5、虚承继的情况:由于涉及到虚函数表和虚基表,会同时增加一个(多重虚继承下对应多个)vfPtr指针指向虚函数表vfTable和一个vbPtr指针指向虚基表vbTable,这两者所占的空间大小为:8(或8乘以多继承时父类的个数);
    6、在考虑以上内容所占空间的大小时,还要注意编译器下的补齐”padding的影响,即编译器会插入多余的字节补齐;
    7、类对象的大小=各非静态数据成员(包括父类的非静态数据成员但都不包括所有的成员函数)的总和+ vfptr指针(多继承下可能不止一个)+vbptr指针(多继承下可能不止一个)+编译器额外增加的字节。
  8.虚继承一个类时,由于涉及到虚表(虚指针),所以大小为4.
42. 
数组在传递给函数时会退化成一个指针,计算它大小时是计算的指针的大小。
43. 
编译预处理有如下几种:
1、头文件包含 #include
2、宏定义 #define
3条件编译 #ifdef #endif
综上所述,C语言有效的预处理命令总是以"#"开头
44. 
malloc申请的是虚拟内存,并不是物理内存。
45. 
拷贝函数的内存重叠问题
46. 
1~i:对每一位 取反运算。为01...1311),是正数,补码即原码,即231-1=2147483647
2-i: 对该数求补运算,即【每位】取反运算,再加1。取反,10...0310-> 01...1311),再加110...0310),该 补 码表现为 最小负数- 2147483648,并没有原码和反码;
31-i:补码形式相加,再推回原码得十进制结果。-i10...0310) )+0 ...1310) )= 10...1300),此为补码形式,补码转 原码为补码减1,再非符号位取反,即原码1...1321= -(231-1)= - 2147483647
4-1-i:补码形式相加,再推回原码得十进制结果。即-i10...0310) )+1 ...1321) )= 01...1311),是正数形式,原码即补码,为231-1= 2147483647
47. 
cat命令:将文件内容一次全输出显示在屏幕上。
more命令:分屏显示文件内容,每次只显示一屏,只允许向前浏览。
less命令:与more相似,并且支持向前,向后浏览。
48. 
 对于只做输入的参数:
a) 始终用const限制所有指向只输入参数的指针和引用。
b) 优先通过值来取得原始类型和复制开销比较低的值的对象。
c) 优先按const的引用取得其他用户定义类型的输入。
d) 如果函数需要其参数的副本,则可以考虑通过值传递代替通过引用传递。这在概念上等同于通过const引用传递加上一次复制,能够帮助编译器更好的优化掉临时变量。
49. 
static成员变量是在类加载的时候生成的
static成员函数既可以通过类名直接调用,也可以通过对象名进行调用
虚函数是C++中的,虚函数不可能是static的
static成员函数可以访问static成员变量
50. 
Strcpy()strcat()的区别
阅读全文
0 0