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

26. 
22.c++ 标准不要求 vector::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  — 包括整体系统信息,其中也包含系统启动期间的日志。此外, mail cron daemon kern auth 等内容也记录在 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_log error_log 信息。
·  /var/log/lighttpd/ — 包含 light HTTPD access_log error_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() 12 32 字节的库实现。 但是 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...1 31 1 ),是正数,补码即原码,即 231-1=2147483647
2 -i : 对该数求补运算,即【每位】取反运算,再加 1 。取反, 10...0 31 0 -> 01...1 31 1 ),再加 1 10...0 31 0 ),该 补 码表现为 最小负数 - 2147483648 ,并没有原码和反码;
3 1-i :补码形式相加,再推回原码得十进制结果。 -i 10...0 31 0 ) ) + 0 ...1 31 0 ) ) = 10...1 30 0 ),此为补码形式,补码转 原码为补码减 1 ,再非符号位取反,即原码 1...1 32 1 = -(231-1)= - 2147483647
4 -1-i :补码形式相加,再推回原码得十进制结果。即 -i 10...0 31 0 ) ) + 1 ...1 32 1 ) ) = 01...1 31 1 ),是正数形式,原码即补码,为 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() 的区别

你可能感兴趣的:(c++,c语言,面试笔试)