研习了Linux公社发布的2013搜狗校园招聘笔试题,还是有些收获的。
//第一题:以下程序的输出是___________________ class Base { public:Base(int j):i(j){}virtual ~Base(){}void func1(){i *= 10; func2();}int getValue(){return i;} protected:virtual void func2(){i++;} protected:int i; };class Child:public Base { public:Child(int j):Base(j){}void func1(){i *= 100; func2();} protected:void func2(){i += 2;} };int main() {Base* pb = new Child(1); //pb指向的是Child类对象pb->func1(); //func1不是虚函数,所以调用Base::func1()cout<<pb->getValue()<<endl; //同理调用Base的函数 delete pb;return 0; } //至于func1中的func2函数调用。 //一般成员函数默认会将this指针作为参数传递给自己,比如: // class A { // public: // void fun() {i = 5;} // private: // int i; // }; // void main { // A a; // a.fun(); // } //那么调用a.fun()时,会将指向a自己的this指针传递给fun函数,所以 // void fun() {i = 5;} //等价于 // void fun(A *this) {this.i = 5;} //所以在上面题目相当于调用func1(this),然后调用this.func2()将this传递给func2函数, //func2函数为虚函数,而这个this指针指向的实质是个Child对象,因此调用Child的func2函数。 //因此答案是12
//这个题目非常有意思。 //第四题:程序出错在什么阶段: #include <iostream> using namespace std;int main() {http://www.linuxidc.comcout<<"welcome to linuxidc"<<endl;return 0; }//A:编译时;B:运行时;C:编译和运行时都出错;D程序运行正常//选D。因为http://www.linuxidc.com中//后面是注释,前面是标签(类似goto的标签)。(坑爹啊)
#include <iostream> using namespace std;class A {public:void foo(){} };class B:virtual public A {public:void foo(){} };class C:virtual public A {public:void foo(){} };class D: public B,public C {public:void foo(){} };int main(int argc, char *argv[]) {cout<<"A 的大小为: "<<sizeof(A)<<endl;cout<<"B 的大小为: "<<sizeof(B)<<endl;cout<<"C 的大小为: "<<sizeof(C)<<endl;cout<<"D 的大小为: "<<sizeof(D)<<endl;return 0; } //答案是1,4,4,8。需要继续充电...