5)没有this指针的额外开销 , 静态成员函数与类的全局函数相比 , 速度上会有少许的增长;
6)调用静态成员函数 , 可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指调用静态成员函数 。
65.sizeof一个类求大小(注意成员变量 , 函数 , 虚函数 , 继承等等对大小的影响)
66请用C/C++实现字符串反转(不调用库函数)”abc”类型的
char *reverse_str(char *str) {
if(NULL == str) { //字符串为空直接返回
return str;
}
char *begin;
char *end;
begin = end = str;
while(*end != '') { //end指向字符串的末尾
end++;
}
--end;
char temp;
while(begin < end) { //交换两个字符
temp = *begin;
*begin = *end;
*end = temp;
begin++;
end--;
}
return str; //返回结果
}
67.写一个函数 , 将字符串翻转 , 翻转方式如下:“I am a student”反转成“student a am I” , 不借助任何库函数
1 #include "stdio.h"
2 #include <IOStream>
3 using namespace std;
4
5 void revesal(char * start, char* end){
6 char *temp_s = start;
7 char *temp_e = end;
8 while(temp_s < temp_e){
9 char temp= *temp_s;
10 *temp_s= *temp_e;
11 *temp_e = temp;
12 ++temp_s;
13 --temp_e;
14 }
15 return;
16 }
17
18 void revesal_str(char *str){
19 if(str == NULL){
20 return;
21 }
22
23 char *start = str;
24 char *end = str;
25
26 while(*++end !='');
27 revesal(start, end-1);
28 cout << str << endl;
29 char *sub_start = str;
30 while(start < end + 1 ){
31 if(*start == ' ' || *start == ''){
32 char *temp = start - 1;
33 revesal(sub_start,temp);
34 while(*++start ==' ');
35 sub_start = start;
36 continue;
37 }
38 ++start;
39 }
40 }
68.析构函数可以抛出异常吗?为什么不能抛出异常?除了资源泄露 , 还有其他需考虑的因素吗?
C++标准指明析构函数不能、也不应该抛出异常 。C++异常处理模型最大的特点和优势就是对C++中的面向对象提供了最强大的无缝支持 。那么如果对象在运行期间出现了异常 , C++异常处理模型有责任清除那些由于出现异常所导致的已经失效了的对象(也即对象超出了它原来的作用域) , 并释放对象原来所分配的资源 , 这就是调用这些对象的析构函数来完成释放资源的任务 , 所以从这个意义上说 , 析构函数已经变成了异常处理的一部分 。
1)如果析构函数抛出异常 , 则异常点之后的程序不会执行 , 如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源 , 则这些动作不会执行 , 会造成诸如资源泄漏的问题 。
2)通常异常发生时 , c++的机制会调用已经构造对象的析构函数来释放资源 , 此时若析构函数本身也抛出异常 , 则前一个异常尚未处理 , 又有新的异常 , 会造成程序崩溃的问题 。
69. 拷贝构造函数作用及用途?什么时候需要自定义拷贝构造函数?
一般如果构造函数中存在动态内存分配 , 则必须定义拷贝构造函数 。否则 , 可能会导致两个对象成员指向同一地址 , 出现“指针悬挂问题” 。
70. 100万个32位整数 , 如何最快找到中位数 。能保证每个数是唯一的 , 如何实现O(N)算法?
1).内存足够时:快排
2).内存不足时:分桶法:化大为小 , 把所有数划分到各个小区间 , 把每个数映射到对应的区间里 , 对每个区间中数的个数进行计数 , 数一遍各个区间 , 看看中位数落在哪个区间 , 若够小 , 使用基于内存的算法 , 否则 继续划分
71. OFFSETOF(s, m)的宏定义 , s是结构类型 , m是s的成员 , 求m在s中的偏移量 。#define OFFSETOF(s, m) size_t(&((s*)0)->m)
72. C++虚函数是如何实现的?使用虚函数表 。C++对象使用虚表 , 如果是基类的实例 , 对应位置存放的是基类的函数指针;如果是继承类 , 对应位置存放的是继承类的函数指针(如果在继承类有实现) 。所以 , 当使用基类指针调用对象方法时 , 也会根据具体的实例 , 调用到继承类的方法 。
推荐阅读
- 如何选购普洱熟茶,如何鉴别普洱熟茶的好坏
- 男人该如何健身比较好?
- 如何正确慢跑呢?
- 如何轻松跑步呢?
- 胸肌中缝应该如何锻炼?
- 腰部赘肉应该如何减掉呢?
- 腰后的赘肉应该如何减掉呢?
- 基础力量应该如何训练?
- 如何收藏普洱茶,普洱茶收藏和存放需注意哪些
- 如何报考高等教育自学考试课程
