常见面试题-概念题答案

c++11/14/17 特性_fdsafwagdagadg6576的博客-CSDN博客
c++ string类实现_fdsafwagdagadg6576的博客-CSDN博客
指针-引用-数组-常见问题_fdsafwagdagadg6576的博客-CSDN博客
c++ stl 总结_fdsafwagdagadg6576的博客-CSDN博客

1 class(类)的大小

类和对象详解草稿_fdsafwagdagadg6576的博客-CSDN博客

2 a+1 and &a+1

a + 1:现在把a看作一个指针,指针+1操作,根据C语言语义,实际增加偏移量的是指针指向类型的长度,即32位机器下的int型,即4字节,故a+1就是&a[1],那么*(a+1)就是a[1],即2;

&a + 1:现在把&a看作一个指针(不知道怎么“看作”? int (*b)[5] = &a,那么&a + 1实际增加的偏移量是其指向类型(int (*)[5])的长度,即20字节,故&a + 1其实是a+5,即&a[5](虽然a[5]是越界访问,但&a[5]没啥问题,这就是C语言)。

int *c=&d;这个指针不同于int (*c);指向一个int型的指针.sizeof (int (*c)=4;一个32bit int共字节的大小.

int (*b)[5] = &a表示指向一个指针,这个指针指向一个int型的数组。

C堆上申请二维数组 - Jone Zhang - 博客园

3 define and const 区别

#define rttrr(a)     a+1

const int a=5;

3.1  define 是编译阶段。 const是运行阶段

3.2  define宏没有类型,不做任何类型检查,仅仅是展开;
     const常量有具体的类型,在编译阶段会执行类型检查;

#define rttrr(a)     a+1要看作者的意图此时返回值为a+5,如果作者希望返回值为5*(a+1)则应为#define rttrr(a)       (a+1)

3.3 define 在常量区。 const在堆or栈中

4  数组指针与指针数组:(两者的区别是对指针带不带括号,是整体括号or仅仅对指针括号)

int (*p)[10]; p即为指向数组的指针,又称数组指针

一个一维指针数组的定义:int *ptr_array[10];

Int (*b[10])(void(*)(int))   这是一个
答案:这是一个指针数组。(void(*)(int)这是一个函数. 返回值是void*,参数是int。假设*p=*b[10](降数组为1维即变量.). 这样p是指向函数地址的指针.b[10]是一组指向函数指针的指针. 

b是一个有10个元素的数组,每个数组元素都是一个函数指针。参数是int,返回值为void*,为int的函数指针。

NOTES:本题分拆说明漂亮!

5 Static_cast,const_cast,reinterpret_cast,dynamic_cast,4种强制转换
参见:C++中的四种cast强制类型转换_villainV8的博客-CSDN博客
static_cast 即c的强制转换.

int i = 10;
double b = static_cast<double>(i);
cout << i << " " << b << endl;

reinterpret_cast 任意转换

int i = 10;
int* b = reinterpret_cast<int*>(i);
cout << i << " " << b << endl;

const_cast 去掉const属性,可以转const 变量(否则const变量value不变,不转不能重新赋值)

const int i = 3;
int* p = const_cast<int*>(&i);
*p = 3;
cout << p << " " << i << endl;

dynamic_cast: 前提or 适用场景:什么是向上转化和向下转化
向上转换:pbase=psub ,没有任何错误
向下转换。psub=pbase编译错误。
对于下行转换:两种情况 1) pbase指向psub,dynamic_cast and static_cast都可以 
2) pbase没有指向psub。 static_cast强转无提示,运行访问异常。
dynamic_cast安全转换,返回null。

C++ 向上与向下类型转换(static_cast与dynamic_cast)_十一月zz的博客-CSDN博客_c++向下类型转换

6  重载和重写

重载是参数个数or参数类型or返回值不同
重写是参数个数和参数类型和返回值都相同。
普通函数可以重载or重写
virtual函数重载,编译重载就是普通重载;运行重载就是基类指针指向子类,pbase->child1hdlr。我看到网文是这样举例子的,我的理解只叫多态,不叫运行or动态重载。
virtual函数重写,和普通重写不同,virtual重写,是子类不是一个,而且规定了子类重写框架,从设计角度规范。子类有框架的重新的基类。普通重写,随便重写。比较业余。
2 #define rttrr(a)     a+1
int f(const int *bb,int *const cc)
{
*bb=0x45;   //错误
cc=(int *)0x45;  //错误
*cc=0x45; //正确
Return rttrr(a)*5
}

向前原则,看const的前面, const int *bb,是int,将(*bb)看成一个整体,是一个值。不能修改,*bb=0x45;  错误.

int *const cc则表示地址固定。所以cc=(int *)0x45;错误,不能将0x45变成新地址,赋予cc。

*cc=0x45; cc中的value倒是可以改.

参见 :http://blog.csdn.net/fdsafwagdagadg6576/article/details/51668940

7  const  int* bb, int* const cc

const int* bb表示值不变, int* const cc表示地址不变.理解为const int* bb=const(int *bb)=const  一个指针指向的值;  int* const cc=int* (const cc),其中cc表示的指针的地址,所以地址是固定的.
一直觉得const char*p 和const *char p 区分,这种试题有什么用?还是有用的,最典型的就是子函数入参,_P=p 
限制指针不能乱指.

#include <stdlib.h>
#define rttrr(a) a+1
int f(const int *bb,int *const cc)
{
  int a=1;
//ff.cc:6: error: assignment of read-only location '* bb'  ; value is fix. point address it is variable
  *bb=0x45;
   bb=(int *)0x45;
//ff.cc:8: error: assignment of read-only parameter 'c; address is fix .value is variable
   cc=(int *)0x45;
   *cc=0x45;
   return rttrr(a)*5;
}
main ()
{
  const int *bbmain;
  //ff.cc:19: error: invalid conversion from 'int' to 'int*'
  //address assign not only value ,but also include address point space data struct
 //地址赋值就是 这样,既要赋值,又要定义指向的空间类型
  int *const ccmain=(int *)0x45;
  int *p;
  bbmain=(int *)malloc(sizeof(int));
  //ccmain=(int *)malloc(sizeof(int));
  f(bbmain,ccmain); 
}

8 c++中swap 函数

最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符

template <class T> void swap ( T& a, T& b )  
{  
    T c(a); 
    a=b; 
    b=c;  
}  

需要构建临时对象,一个拷贝构造,两次赋值操作。

针对int型优化

void swap(int & __restrict a, int & __restrict b)  
{  
a ^= b;  
b ^= a;  
a ^= b;  
} 

无需构造临时对象,异或。

9 operator 相当于对象or类的强制转化

http://zhidao.baidu.com/link?url=daXkcy9juNOiPU-h0QOU8I9Ib4FLJ1KurnD8WcdfstPSh3oynMofZKbgPbFRufdEEGTy_fqNNNjIjiHLxtwEl1DRD0Lsr5A1K_0lkZtUnqi

10 : what is the different between struct and class

c struct just keep data.

c++ struct 和class 非常类似 . 可以有函数定义和实现,可以继承,多态。

仅仅区别是struct public,class private。 struct不能做模板参数。

但是official的做法是用class。 struct 就是用于数据存储

11  new/delete 和malloc/free 的区别
new/delete是面向对象的,所以多了构造函数和析构函数.
new/delete 和malloc/free 的区别一般汇总new/delete 和malloc/free 的区别一般汇总 - as_ - 博客园

,,,,,,,,,,,,,,,,

下面内容均来自网络:
1.网络基础:tcp/ip卷一tcp那章所有内容都考到了,包括PAWS,几种定时器,close_wait状态。 必须能记住几张图,并且知道大多数细节。
协议栈实现原理推荐 阿里陶辉 的博客 。网络编程基础推荐, <游双的linux高性能服务器编程>,最好理解全文。
3.C++语言方面:除了 各种关键字,还问到了迭代器种类(偏特化,type_traits),考了 S TL源码剖析前三章 。C++内存模型只问虚函数。腾讯问了Array模板类的实现改错(果断跪)。
4.设计模式:问了装饰,适配器,***区别,做后台必须明白reactor是哪几个模式合成的吧。
5.数据库:记忆innodb,myisam区别保命。
6.除了腾讯不看重,其他的都很看重对 剑指offer 的掌握程度。
但是不一定要最优解,比方说复制带环的链表,写个差的总比写不出来强。
8.分布式范型:nosql的副本策略,心跳,***, 分布式hash (On的ring , logn的finger table,
O1中心节点,ceph神奇的CRUSH)推荐google三篇中文版+阿里云在线课程ppt.吹架构看 阿里李智慧 的书.
9.高级网络编程(optional): 粘包问题(消息协议格式设计),protobuf使用,reactor网络库原理(各种网络api处理细节,连接生命周期,事件回调,如果能说出网络库原理,别人再也不想问你网络了,毕竟懂得人不多)这几个需要看 陈硕 的书就够了。 tcp重新封装改良思路推荐 kcp (在github上搜索)。
动态upstream机制设计,机器少怎么测试高并发。sleep能否模拟网络延迟(一直不懂什么意思)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值