GEEK学习笔记— —程序员面试宝典笔记(二)
2016-04-20 14:14
267 查看
所谓笔记,就是比较个人的东西,把个人觉得有点意思的东西记录下来~~
程序员面试宝典笔记(一)基本概念
程序员面试宝典笔记(二)预处理、const和sizeof
程序员面试宝典笔记(三)auto_ptr、递归
程序员面试宝典笔记(四)面向对象、类型转换、static
程序员面试宝典笔记(五)数据结构基础
程序员面试宝典笔记(六)软件测试
2)情况2与情况1相同。
3)情况3为指针本身是常量,这种情况下不能对指针本身进行更改操作,而指针所指向的内容不是常量。对于情况3,定义时必须同时初始化。
4)对于情况4为指针本身和指向的内容均为常量。
下面再说一下const成员函数是什么?
我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是“只读”函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。
在const成员函数中,用mutable修饰成员变量名后,就可以突破const的限制,修改类的成员变量了。
● const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误(边际效应)。
● 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。在C++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。
代码一
代码二
代码一类A的对齐为
|bool|—-|—-|—-|
|——–int———|
|bool|—-|—-|—-|
代码一类B的对齐为
|——–int———|
|bool|bool|—-|—-|
而代码二用pack预处理指令来禁止对齐调整。所以就是本身的内存大小。但是需要注意sizeof是计算栈中分配的内存大小,静态变量是存放在全局数据区,不会被计算在内。
代码二:类A 5字节;类B 6字节
程序员面试宝典笔记(一)基本概念
程序员面试宝典笔记(二)预处理、const和sizeof
程序员面试宝典笔记(三)auto_ptr、递归
程序员面试宝典笔记(四)面向对象、类型转换、static
程序员面试宝典笔记(五)数据结构基础
程序员面试宝典笔记(六)软件测试
题目
写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。解析
为什么要把如此简单的题目也放进来呢?为了强调宏定义里面括号的重要性!!!答案
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
题目
const与指针的关系?const成员函数?以及mutable!解析
一般分为4种情况:int b = 500; const int* a = &b; int const* a = &b; int* const a = &b; const int* const a = &b;
答案
1)先看情况1。如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。因此,1和2的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),这种情况下不允许对内容进行更改操作。对于情况1,可以先不进行初始化。因为虽然指针内容是常量,但指针本身不是常量。2)情况2与情况1相同。
3)情况3为指针本身是常量,这种情况下不能对指针本身进行更改操作,而指针所指向的内容不是常量。对于情况3,定义时必须同时初始化。
4)对于情况4为指针本身和指向的内容均为常量。
下面再说一下const成员函数是什么?
我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是“只读”函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。
在const成员函数中,用mutable修饰成员变量名后,就可以突破const的限制,修改类的成员变量了。
题目
const与#define相比有什么不同?答案
C++语言可以用const定义常量,也可以用#define定义常量,但是前者比后者有更多的优点:● const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误(边际效应)。
● 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。在C++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。
题目
下面两段程序分别输出什么?代码一
#include <iostream> using namespace std; class A { private: bool a; int b; bool c; }; class B { private: int b; bool a; bool c; }; int main() { cout << sizeof(A) << endl; cout << sizeof(B) << endl; return 0; }
代码二
#include <iostream> using namespace std; #pragma pack(1) class A { private: static bool a; int b; bool c; }; class B { private: int b; bool a; bool c; }; int main() { cout << sizeof(A) << endl; cout << sizeof(B) << endl; return 0; }
解析
很明显,这道题是考察结构的对齐。一般来说,为了方便对结构体内元素的访问和管理,结构体的长度一定是最长的数据元素的整数倍。代码一类A的对齐为
|bool|—-|—-|—-|
|——–int———|
|bool|—-|—-|—-|
代码一类B的对齐为
|——–int———|
|bool|bool|—-|—-|
而代码二用pack预处理指令来禁止对齐调整。所以就是本身的内存大小。但是需要注意sizeof是计算栈中分配的内存大小,静态变量是存放在全局数据区,不会被计算在内。
答案
代码一:类A 12字节;类B 8字节代码二:类A 5字节;类B 6字节
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性