有很多的人热衷于对于考题的崇拜,对于ACM的崇拜,对于算法的崇拜,在学校里面现在考察一个人能力的标准仍然在于给的笔试题你能考多少分,而且笔试题重复率实在是太高了,以至于我在笔试的时候都打算拿手机出来百度一下,因为有些题我知道我做过,一样的题,有些笔试前没有好好复习,有些遗忘,有些复杂的数据结构算法题或者大公司的某些数学题,推理题,不想再想了,感觉没有意思。所以开此篇文章来记录现在或者是以后所有碰到的笔试面试题,很多的笔试面试题记了又忘,忘了又记。
奉劝仍然在学校的学习VC的小朋友们,多做一些ACM题,学习阅读STL源码,不要把精力放在MFC框架和或者其他开发领域的开发框架和开发包上了,校园招聘笔试面试体现不出优势来。
这里的试题给出的答案如有问题也请评论一下,共同探讨,共同进步
1.谈谈你对面向对象的理解
答:不知道面试官想要什么样的答案,如果我说:封装,继承,多态。这么简单的答案他们会不会满意
2.sizeof
char str[] = “http://www.ibegroup.com/” //修饰数组指针 大小为17
char*p= str ; //指针4
int n=10; //int型4
请计算sizeof (str )= ? //--(1)
sizeof ( p )= ? //--(2)
sizeof ( n )= ? //--(3)
void Foo (char str[100]){请计算sizeof( str ) = ? //--(4)} //数组指针退化为指针 4,这个得记得
void *p= malloc(100); //指针为4
请计算sizeof ( p )= ? //--(5) //不知道会不会考结构体的内存对齐的知识,觉得没有意思。
3.虚函数
第一题:
#include <iostream>
#include <string>
using namespace std;
void println(const std::string& msg)
{
std:cout < <msg < <'\n';
}
class Base{
public:
Base() {
println("Base::Base()");
Virt();
}
void f(){
println("Base::f()");
Virt();
}
virtual void Virt(){
println("Base()::virt()");
}
};
class Derived:public Base
{
public:
Derived(){
println("Derived:: Derived ()");
Virt();
}
virtual void Virt(){
println("Derived ()::virt()");
}
};
int main(int argc,char* argv[])
{
Derived d;
Base *pB=&d;
pB->f();
}
输出结果是
Base::Base()
Base()::virt() //构造函数中调虚函数,虚函数的特性失效。尽量不要在构造函数中调用虚函数。
Derived:: Derived ()
Derived ()::virt() //同上
Base::f()
Derived ()::virt()
第二题:
#include <iostream>
using namespace std;
class CBase
{
public:
CBase(){m_date=9;}
virtual void send()
{
cout <<"send:" <<m_date <<endl;
}
void Output()
{
send();
}
int m_date;
};
class CBoy:public CBase
{
public:
virtual void send()
{
m_date++;
cout <<"send:" <<m_date <<endl;
}
void Output()
{
CBase::send();
}
};
int main()
{
CBoy boy; //m_date=9
CBase &base=boy;
base.send(); //m_date++ 调用的是 CBoy 中的 send() send:10
CBase *pbase=&base;
pbase->send(); //m_date++ 调用的是 CBoy 中的 send() send:11
boy.Output(); //显示调用 CBase 中的 send() send:11
system("PAUSE");
return 1;
}
1.虚函数的调用即动态绑定只能使用指针或引用,一切通过类对象进行的函数调用全是静态绑定。
2.我理解虚函数是专门对付类的强制类型转换的。如果子类和父类不进行类型转换,要虚函数干嘛?
4.string函数的构造操作符重载
5.枚举
enum some_fruit {apple = 3, orange, banana = 4, bear};
arange=? bear=? //4,5
6.内联函数
遇到一个选择题,也不记得四个是什么选项了。
1.程序中,调用内联函数时,该函数在编译时被替代,而不是像一般函数那样是在运行时被调用
不过在实际的编程中我却很少在工程中看到有人用内联函数,用的少了,就自然对他会感到陌生
7.const的作用
如果我直接写:标明它修饰的变量为只读属性,这样不知道有没有分,做了这么多的笔试题也见到不到标准的答案,都是网上的答案,有些网上的答案不能我觉得不称之为答案,因为很多的答案写下来有半页,因为有很多解释,但是在笔试的时候不可能写这么多,有些却是一句话,但是题有5分,10分的,一句话解释清楚不知道他会不会给分
1.对于类的成员函数返回值,若指定const,表明函数体内不能修改类的成员函数
2.修饰一个变量为常量
3.修饰指针,指针地址不能改变,或者修饰指针的指向的值,表示指针指向的数据不能改变
4.修饰函数的形参,表示函数体内不可改变形参的值
(只是在不同情况下的只读属性,这样描述也不知道会不会有分)
8.什么是向前声明,向前声明应该注意什么
今天笔试的时候竟然有道这样的题10分。向前声明的概念学了这么久的c++竟然在笔试的时候看到!回来查了一下,原来是类的相互调用的时候就曾经用过了。
只是不知道那叫做向前声明。网上也没有找到标准的答案。自己认为
如:class a;在b类的头文件声明一个类a ,类a的声明在另外一个头文件中,不知道这么描述它的概念,我只知道它是什么。
应该注意什么:不要在类b的头文件中去实例化a,而只能声明一个指针,如:a *c;
不知道这样写会不会有分
9.#include<file.h>与#include"file.h"的区别
答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径下搜寻file.h
10.类成员函数的重载,覆盖的区别
本来是想写重载和覆盖的概念的,重载是有相同函数名,返回值,函数的形参的个数或者数据类型不同。而覆盖是在子类和父类中都有相同的函数名,返回值,形参的个数
和数据类型也相同。写完也有忧虑,一句话怕拿不到人家的6分,只能是你看着给分吧。
网上答案:重载特性
(1)相同的范围(在同一个类中)
(2)函数名相同
(3)参数不同
覆盖特性
(1)不同的范围
(2)函数名相同
(3)参数相同
记不住这一条一条的!
11.单链表的倒序
//看上去代码并不是很长你是否记得住呢?即使是算法思路记得住,能够在考场没有编译器调试的情况下在纸上准确无误的写出来吗?
昨天还碰到一个要在试卷上默写出快排的算法,没有多想,做完基础题就交卷了,哎,我想在笔试的时候要临时磨磨刀了,即使我现在把答案写在这里,明天同样考这道题,今晚不记一下,明天就只能写个大概,能够完全写正确的信心还是没有的。
12.面试的时候考官问的,都问过两次了:为什么学习C++;(我一般是投递的是c++工程师,看到c++工程师,都不知道自己将来如果面试进了,要做什么事,因为现在在我学校
园招聘来的大部分都是外包公司,还有几家去年刚成立的,公司要求如果能具体到c++工程师就哦米拖佛了,大部分是会c++/java/c/c#中的一种,我希望进公司后不要让我去
建网站,哦米拖佛)
这个我也不知道面试官想要什么答案,有时候觉得面试的时候这些主观题自己的想法并不重要,重要的是自己的话面试官有没有兴趣,认不认同。
这个问题我也不知道怎么去迎合面试官,就只能如实回答:
自己认真开始学习编程的语言就是c++,大一上学期学c的时候还不知道编程是什么玩意,因为高中是好学生,没有接触电脑。c++就像是自己的母语一般,从大一下学期一直
学到现在,因为感觉c++博大精深需要时间学,所以想暂时把c++学好,至于java,c#,尽管学校有这些课,我只是没有挂掉他们,不敢说熟练。
这都是后话,意思就是这么个意思.