我只会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
 9- class 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 | 
这个修饰符的问题应该算是比较常见,但是因为我用的不多,就每太在意,遗憾!
