C++面试知识点总结

程序设计基本概念

1、int i=1;

void main(){

       inti=i; //i是一个未定义的值

}

2、类型转换

C++定义了一组内置类型对象之间的标砖转换:

  • 如果一个操作数的类型是long double,另一个操作数将转换成long double

  • 如果都不是long double,其中一个是double,则另一个转换成double

  • 同理,一个是float,其他的转换成float

  • 如果两个操作数都不是3种浮点数类型之一,它们一定是某种整值类型,在确定共同的目标提升类型之前,编译器将在所有小于int的整值类型上施加一个被称为整值提升的过程。

3、运算符问题

1) unsigned char a=0xA5;

uUnsignedchar b=~a>>4+1;

cout<<b;  //结果是250,因为寄存器是16位的

2) 用一个表达式,判断一个数X是否是2N次方,不可用循环

!(X&(X-1))

3) 下面代码:

return(x&y)+((x^y)>>1)  (729,271)=500

4)不用if等判断语句,找出两个数中较大的值

int max=((a+b)+abs(a-b))/2

5)如何将两个值进行交换,并且不适用任何中间变量

a=a^b; b=a^b; a=a^b;

4CC++的关系

1)在C++程序中调用被C编译器编译后的函数,为什么要加extern “C”

C++提供了C连接交换指定符号解决名字匹配问题

2)头文件中的ifndef/define/endif

防止该头文件被重复引用

 

预处理、constsizeof

1、宏定义

1)用一个宏定义FIND求一个结构体struc里某个变量相对struc的偏移量:

#defineFIND(struc,e) (size_t)&(((struc*)0)->e

 

指针和引用

1class A{ public: int a; A(){ a=1;}  void print(){cout<<a;};

class B:public A{public:int a;B(){ a=2 ;}};

B b; b.print(); cout<<b.a;   //结果是1 2

2、函数指针

1)float(**def)[10] def是一个二级指针,它指向的是一个一维数组的指针,数组元素是float

2)double*(*gh)[10] gh是一个指针,它指向一个一维数组,数组元素都是double*

3)double(*f[10])()  函数指针数组,f是一个数组,元素是函数的指针

4)int*((*b)[10])  一维数组的指针

5)Long (*fun)(int) 函数指针

6)Int(*(*F)(int,int))(int) F是一个函数的指针,指向的函数的类型是有两个int参数并且返回一个函数指针的函数,返回的函数指针指向有一个int参数且返回int的函数

7)int(*ptr)[]指向整形数组的指针

8)int *ptr[] 指针数组

9)int(*a[10])(int)一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整形值

3、指针数组和数组指针

1)int a[]={1,2,3,4,5}

  int*ptr=(int *)(&a+1)   //&a+1指向数组后面

  cout<<*(ptr-1);        //输出5

2)C++中有了malloc/free,为什么还需要new/delete

对于非内部数据类型的对象而言,只用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前需要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。New和delete不是库函数,是运算符

4、指针和句柄

1)句柄和指针的区别和联系是什么?

句柄是一种指向指针的指针

句柄和指针其实是两个截然不同的概念。Windows系统用句柄标记系统资源,隐藏系统的信息。你只要知道有这个东西,然后去调用就行了,它是个32bit的unit。指针则标记某个物理内存地址,两者是不同的概念

 

STL模板与容器

1、泛型编程

1)什么事泛型编程?

STL代表用一致的方式编程是可能的。它并不是试图用C++编程,只是试图找到一种正确的方式来处理软件,寻找一种可以表达我们的想法的语言而已。泛型编程是一种基于发现高效率算法的最抽象表示的编程方法,也就是说,以算法为起点并寻找能使其工作有效率的最一般的必要条件集,并且这些必要条件有多种不同的实现方式。

 

继承与接口

1、以下代码的输出结果是什么?

classA{ protected: int m_data;  public:A(intdata=0){m_data=data;

intGetData(){return doGetData();} virtual int doGetData(){return m_data;}};

classB: public A{ protected: int m_data; public:B(int data=1){m_data=data;

intdoGetData(){return m_data;}};

classC: public B{ protected: int m_data; public:C(int data=2){m_data=data;}}

c.GetData() C未定义,调用B中,B未定义,调用A中。A中为虚,调用B中

c.A::GetData()—A为虚,C未定义,调用B中

c.A::doGetData()—直接调用A中

 

2、三种继承方式

公有继承:基类的公有成员和保护成员可见,基类的公有成员和保护成员作为派生类得成员时,它们都保持原有的状态;基类的私有成员不可见,基类的私有成员仍然是私有的。在公有继承时,派生类的对象可以访问基类中的公有成员,派生类的成员函数可以访问基类的公有成员和保护成员。

私有继承:基类的共有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类访问。

保护继承:基类的公有成员和保护成员都作为派生类的保护成员。

例:class Parent{public: Parent(intvar=-1){m_nPub=var;m_nptd=var;m_nptr=var;}

public:int m_nPub; protected: int m_nptd; private: int m_nPtr;};

classChild1: public Parent{public: int GetPub(){return m_nPub;};

         int GetPtd(){return m_nPtd;};  int GetPtr(){return m_nPtr;};};

classChild2: protected Parent{public: int GetPub(){return m_nPub;};

         int GetPtd(){return m_nPtd;};  int GetPtr(){return m_nPtr;};};

classChild3: private Parent{public: int GetPub(){return m_nPub;};

         int GetPtd(){return m_nPtd;};  int GetPtr(){return m_nPtr;};};

Child1cd1; Child2 cd2; Child3 cd3; int nVar=0;

cd1.m_nPub=nVar;

cd1.m_nPub=nVar; //父类保护变量,可以被公有继承派生类对象访问但不可以修改

nVar=cd1.GetPtd();

cd2.m_nPub=nVar;//保护继承的派生类对象不可以直接修改父类的公有变量

nVar=cd2.GetPtd();

cd3.m_nPub=nVar;

nVar=cd3.GetPtd();//私有继承的派生类对象可以通过函数访问父类的保护变量

 

位运算与嵌入式编程

1、建立一个联合体下面的程序运行结果是什么?

union{ char a;  int i;}u; u.i=0xf0f1f2f3;

cout<<hex<<u.i;       //f0f1f2f3

cout<<hex<<int(u.a);   //f3内存中数据低位字节存入低地址,数据的地址用低地址表示

 

2、写出程序运行结果

int *pa=NULL;  int *pb=pa+15;

printf(“%x”,pb);//15*4=60,60的十六进制结果是3C

 

3、嵌入式编程

中断服务子程序(ISR)ISR不能反悔一个值;ISR不能传递参数;ISR应该是短而有效率的,在ISR中做浮点运算是不明智的;在ISR中一般不使用printf().

 

4、关键字volatile有什么含义?一个参数可以既是const又是volatile吗?指针可以是volatile吗?

定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会假设这个变量的值了,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

可以既是const又是volatile,一个例子是只读寄存器

可以是指针,一个例子是当一个终端服务子程序修改一个指向buffer的指针时

 

5、设置一绝对地址的值

Int *ptr;  ptr=(int*)0x67a9;  *ptr=0xaa55;

 

6、unsigned int compzero=0xFFFF;//这是不对的,应改为unsigned int compzero=~0;

 

7、char *ptr; if((ptr=(char*)malloc(0))==NULL) cout<<”null”; else cout<<”valid”;//Valid

 

8、在小尾字节系统中,这段C程序的结果是多少?

structbitstruct{ int b1:5; int: 2; int b2:2;}bitstruct;

bitstructb; memcpy(&b,”EMC EXAMINATION”,sizeof(b)); cout<<b.b1<<b.b2;

E和M的ASCII值时0x45和0x4D,1010 0010 1011 0010,bitstruct是9位,b在内存中如下:1010 0010 1,b1占5位:1010 0,中间跳过两位01 结果是5和-2

 

设计模式与软件测试

1、用设计模式的观点描述先有鸡还是先有蛋。

先有鸡还是先有蛋问题只是对面向对象本质的一个理解,将人类的自然语言放在此处理解并不合适。根本不存在鸡与蛋大问题,而是型与值的问题,以及指针引用的问题,因为鸡和蛋两个对象间是引用关系而不是包含关系

 

2、用设计模式的思想描述蜡笔和毛笔的不同

这是一个Bridge模式。为了一幅画需要准备36只型号不同的蜡笔,而改用毛笔3支就够了。通过该模式可以将乘法运算变为加法运算。该模式的用意是将抽象化与是鲜花脱藕,使得二者可以独立地变化。Bridge模式将继承关系转换为组合关系,从而降低了系统间的耦合。

 

3、观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题帮助。这个帮助对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

 

4、软件测试

  • 描述一个测试结束的准则:一个测试结束的标准可以查看已提交的bug是否已经全部解决并已验证关闭,一般bug验证率在95%以上,并且没有打的影响功能的bug处于未解决状态,就可以测试通过。

  • 在一个测试计划中能包含哪些内容

可以包含需要测试的产品的特点和主要功能模块,列出需要测试的功能点,并标明侧重点;测试的策略和记录;测试资源配置。

  • 描述功能测试和可用性测试之间的区别

功能测试主要是黑盒测试,由测试人员进行,主要验证产品是否符合需求设计的要求;可用性测试主要是由用户来进行的测试,主要是对产品的易用性进行测试,包括有用性、效率和用户主观满意度。其中有效性指用户完成特定任务和达到特定目标时所具有的正确和完整程度;效率指用户完成任务的正确和完整程度所使用资源之间的比率;满意度指用户在使用产品过程中所感受到的主观满意和接受程度。

  • 白盒测试的测试方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法等

  • 基本路径测试法的步骤:画出程序的控制流图;计算程序圈复杂度;导出测试用例;准备测试用例确保基本路径集中的每一条路径的执行

文章来源:百度文库

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值