我只会C++
,是真的,但是不只有C++
,也是真的~,我只会Debug,我所掌握的知识,有一半以上是在Debug中学习的。
上午面了某外企技术面,比较轻松,因为是实习转正,整个面试就是在了解我擅长的东西。
以前经过了不少面试,每当我用C++回答“你最擅长什么?”问题的时候,很多面试官说C++只是一门语言,每当问到这里,我通常是说不出话,但是出了C++还有计算机基础比较扎实,其他的我真说不出有什么长处,我没有用过Hadoop
,没有使用Spark
,Python
我只是当作脚本使用来处理我的实验数据,不会用R
语言,没有Shell
编程经验。。。但是我真的是基础很牢固,我会使用Lisp
写程序(可能很多人没听说过,可能有些人很不屑),我最喜欢的事是Debug
,本科期间,占用我时间最长的不是开发项目,而是Debug
,给自己(我自己写程序很严谨),给其他人(大多数是女生),到大二的时候,我们学院同一级的同学(大约500人)几乎没有人不认识我,原因就是能帮他们解决各种Bug
。
我是只会C++
,不对,不能这么说,我还会Java
和C#
,只不过我最擅长的是C++
—相对,面完了今天下午的一家公司后,我决定添加相对两个字,我确实没有考虑面试官问的问题。
倒不是我喜欢不学习,而是我更喜欢从实践中获取这些知识,面试官问我的问题,我通常会告诉面试官我是如何解答它的,要是在实际项目中我遇到的问题,通常会简单的描述一下问题的根源,我认为这是非常好的学习方式,其实我在大一的时候,就通过帮别人Debug的时候学习知识,更多的是我知道了问题的根源,最常见的问题就是指针(内存),所以我对C++有比较深的感情。另外,我也在读书,很多实验室小伙伴并不是很看好的书,比如《程序员的自我修养》,因为看这本书还被嘲笑过,我从没在意过,因为书中讲到的问题我没遇到过,我很喜欢这种求解新奇问题,就像我可以连续6个小时不吃饭帮人Debug
,有些问题,我会解释我在什么书中学到的,我也觉得这是很好的学习方式。
不过,今天晚上的面试确实遇到了一个问题,我没有回答上来,倒不是有多么难,是自己没遇到过,就没有深入的研究这类问题,虽然回答了很多有意思的问题,但是这个问题给面试官留下了不好的印象,真的非常遗憾。
- 指针问题
比如下面一段代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#include <iostream>
using namespace std;
class A
{
public:
void func1(int x){cout<<x<<endl;};
void func2(int x){cout<<y<<endl;};
static void func3(int x){cout<<x<<" "<<z;};
private:
int y;
static int z;
};
int A::z = 0;
int main()
{
// cout << "Hello World!" << endl;
A* a = new A();
a->func1(2);;
a->func2(2);
a->func3(2);
delete a;
return 0;
}
输出什么?1
2
32
0
2 0
这个比较简单,func1
直接输出参数;func2
输出的是成员变量y
,类成员变量被默认初始化为0(非自定义类型);func3
输出的是参数还有一个静态变量,静态变量只能在类外初始化,这一点我知道,但是被private
吓到了!
面试的题目是这样的:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#include <iostream>
using namespace std;
class A
{
public:
void func1(int x){cout<<x<<endl;};
void func2(int x){cout<<y<<endl;};
static void func3(int x){cout<<x<<" "<<z;};
private:
int y;
static int z;
};
int A::z = 0;
int main()
{
// cout << "Hello World!" << endl;
A* a = new A();
delete a;
a->func1(2);;
a->func2(2);
a->func3(2);
return 0;
}
这样会输出什么?1
2
32
723435
2 0
这个其实func1
和func3
都比较容易判断,因为对象空间被销毁了,但是类型还是在的,这两个函数都没有使用对象的东西,都是使用类型的成员,所以输出不变,中间这个函数有些奇怪了,因为空间被回收了,但是可能并没有马上被其他程序占用,所以可能还是有可能跟原来的是一样的,但是根据不同平台,也根据不同的编译器,都有不一样,比如我这里是win平台,MinGW编译器,出来这样的结果,每次运行都是不一样的。
const
&static
看看这下面三种不同修饰符的成员怎么初始化?1
2
3
4
5
6
7
8
9class B
{
public:
B();
private:
static int a;
const int b;
static const int c;
};
静态数据成员必须在类外初始化,而且这是静态变量的唯一的初始化方式,也就是这样:1
int B::a = 0;
对于常量,必须在构造函数的初始化列表初始化,在构造函数体内不行,这是是常量的唯一初始化方式,比如这样:1
2
3B::B():b(0)
{
}
最变态的是两个都有的,怎么初始化,首先是静态的,静态的话就不能跟构造函数沾边,既不能放在构造函数函数体,也不能放在初始化列表,然后是常量,常量就必须在初始化列表,这不是矛盾吗?那就在类的定义里面初始化吧。
1 | class B |
这个修饰符的问题应该算是比较常见,但是因为我用的不多,就每太在意,遗憾!