`
backsnow
  • 浏览: 127468 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

《C/C++程序员面试宝典》笔记

 
阅读更多

 

《C/C++程序员面试宝典》

1, 类型转换通用的指导原则

1,为防止精度损失,如果必要的话,类型总是被提升为较宽的的类型;int和unsigned int因为类型宽度一样,则不符合这个规则,两个变量均转换为unsigned int计算;

2,所有含有小于整型的有序类型的算术表达式在计算之前其类型都会被转换成整型;

 

2,程序设计问题

 

1,main主函数执行完毕后,如何在执行一段代码?

 

利用aexit()函数注册一个函数,见P37

 

2,C++中“”头文件从工作路径开始搜索,而<>头文件从标准库路径开始搜素

3,预处理,const和sizeof

1, 用宏表示一年有多少秒:

#define SECONDS_PER_YEAR (60*60*24*365)UL

 

2,const 和#define的区别:

1)const有数据类型,而宏常量没有;

2)有些集成化的调试工具可以对const常量调试,但是不能对宏常量调试,C++中只用const而不用宏常量说明前者可以取代后者;

 

3,结构体对齐问题:

struct A{short a1; short a2; short int a3;}; struct B{long b1; short int b2};

sizeof(A) sizeof(B)分别为6,8。 我认为是按照结构体中最宽的类型对齐,文中解释有问题。

 

空类的sizeof()为1, 静态变量存储在全局区,所以计算sizeof时忽略它, double的长度为8,float,int为4,char为1

 

4,sizeof和strlen()函数的区别见 P49

 

5,sizeof的使用场合

1)主要用途是与存储分配和I/O系统那样的例程进行通信。如Malloc, fread函数

...

 

6,空类和多重继承的空类都占空间1,但是空类虚继承空类的话子空类占空间为4

 

4,指针和引用

1,两者的区别:

 

1)非空区别:任何时候都不能指向空值的引用, 不存在指向空值的引用这个事实意味着引用的代码效率比指针要高;

2)合法性测试:引用在使用之前不需要测试其合法性,而指针总是该被测试,防止其为空;

3)可修改区别:指针可以被重新赋值以指向另一个不同的对象。而引用总是指向在初始化时被指定的对象,以后不能改变,但是其指向的对象内容可以改变;

4)应用区别:在以下情况应该使用指针,一是存在不指向任何对象的可能性;二是需要在不同的时刻指向不同的对象。如果指向一个对象后不会再改变指向,就应该使用引用。

 

2,类的this 指针:

1) this只能在成员函数中使用,而不能在全局函数、静态函数中使用;使用时如同将this指针作为第一个参数传入;

2) this在成员函数的开始前构造,在成员函数的结束后清除;

3)this指针根据编译器的不同存放在不同的位置;

 

3,函数内用指针实施内存分配:

注意要用指针的指针才能让函数外的指针指向函数内指针副本分配的空间地址

 

4,c++中有malloc/free,还引进new/delete的目的:

malloc/free是库函数而不是运算符,不能把构造函数和析构函数的任务强加给malloc/free,于是引进new/delete来完成内存分配、初始化工作和内存清理、释放工作。

  

 5,面向对象

1,面向对象编程的基本概念:

面向对象语言必须提供类,对象,继承;

 

2,空类产生哪些成员函数:

默认构造函数,析构函数,拷贝构造函数和赋值函数;

 

3,类中的静态成员记得赋初值。

 

4,类中,常量const必须在构造函数的初始化列表里赋值,或者设置为static;

 

5,析构函数可以是内联函数;在有派生类出现时,定义为虚函数是必要的,这样保证了在任何继承情况下不会出现派生类的析构函数未被调用而出现内存泄露的情形;

 

6,构造函数不能为虚函数:自己理解的原因:保证语言的逻辑正确性,父类的构造函数若能调用派生类的构造函数,可能初始化派生类中存在而父类不存在的成员变量,出现错误。

 

7,所有需要分配系统资源的用户自定义类型都需要定义拷贝构造函数;有一个默认的拷贝构造函数

 

8,多态,可以看成是一个接口,多个方法; 继承的目的是代码重用(以前的说法),而多态的目的是接口重用。

重载overload(函数同名函数表不同的函数), 覆盖override:虚函数在派生类中被改写。

 

6,继承与接口

1,私有继承与保护继承的区别:在无继承的类中,两者是没有区别的;在有继承的类中,基类的Private成员对所有外界都屏蔽,基类的protected控制符对应用程序是屏蔽的,对其直接派生类是可访问的,但同样不能往下继承。

 

2,C++中如何阻止一个类被实例化? 使用抽象类,或者构造函数被声明为Private

 

3,构造函数在什么情况下声明成private?比如要阻止编译器生成默认的拷贝构造函数

 

 

7,COM组件对象模型

COM不是接口,不是对象,也不是标准,符合COM标准的对象就是COM对象。其实COM对象无非是实现了很多接口的对象而已

 

8,位运算

1,printf("%f",3); 整数3以0000 0000 0000 0000 0000 0000 0000 0011的形式压入栈
    
printf函数输出的应该是内存为0000 0000 0000 0000 0000 0000 0000 0011 **** **** **** **** **** **** **** ****的double型数据,double的第一位为符号位,后11位为指数位(全0 表示-1023),后52位为尾数位。

所以,这个double型数据应该等于一个大于1小于2的数乘上2^(-1023),是一个非常小的数,输出取六位小数,所以为0.000000

2,十进制=8进制/10*8+8进制%10

8进制=10进制/8*10+10进制%8

3,C++中的4种运算符转化:

const_cast:消除const属性的转换;

static_cast:强制隐性转换,类似于C-style的转换,如int转换为double,也可以non-const转换为const,也可以用来反向转换,如void*转换为有类型的指针;

dynamic_cast:安全的向下转型,涉及到继承类型的转换;

reinterpret_cast:底层的强制转换,如指针转换为整型;

4,一个字节取的最大整数是255,两个字节(如short int)取的最大整数是65535

5,

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics