研习了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.com cout<<"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。需要继续充电...