高分求教外企c++开发笔试题目答案!

时间:2022-05-12 02:35:08
1.
#include <iostream.h>
class   A    
{
public:    
static   int   num;
A() {cout<<num++;}
~A(){cout<<num--;}    
};

int   A::num=0;    

class  B:  public A
{
public:
B(){cout<<num++;}    
~B(){cout<<num--;}    

A  f(A   a) {return   a;}    
};

int   main()
{
A   a;
B   b;

b.f(b);
return   0; 
}

2.
#include<iostream>
using namespace std;
int main()
{
 string str;
 string str1("I love you");
 if (str.empty())
 {
  cout<<"str的值为空"<<endl;
 }
 else
 {
  cout<<"str的值为"<<str.size()<<endl;
 }
 if (str1.empty())
 {
  cout<<"str1的值为空"<<endl;
 } 
 else
 {
  cout<<"str1的值为"<<str1.size()<<endl;
 }
 system("pause");
 return 0;
}

3. Write the following program result
 #include<iostream>
using namespace std;
int main()
{
 int a=5,b=6,c=7,d=8,m=2,n=2;
 (m=a>b)&&(n=c>d);
 cout<<m<<','<<n<<endl;
}

4. Write the following program result
class base
{
public:
int a;
virtual void print() {cout<< "base" <<endl;}
};

class derived1 : virtual public base
{
public:
int d1;
virtual void print() {cout << "derived1" << endl;}
};

class derived2 : virtual public base
{
public:
int d2;
virtual void print() {cout << "derived2" << endl;}
};

class grandson : public derived1,public derived2
{
public:
int g;
virtual void print() {cout << "grandson" << endl;}
};



int main()
{
base *pb;
base b;

grandson gs;
derived1 d1;
derived2 d2;

pb = &b;
pb->print();

pb = &gs;
pb->print();

pb = &d1;
pb->print();

pb = &d2;
pb->print();

return 0;
}

5.

class CNullPointCall
{
public:
    static void Test1();
    void Test2();
    void Test3(int iTest);
    void Test4();

private:
    static int m_iStatic;
    int m_iTest;
};

int CNullPointCall::m_iStatic = 0;

void CNullPointCall::Test1()
{
    cout << m_iStatic << endl;
}

void CNullPointCall::Test2()
{
    cout << "Very Cool!" << endl; 
}

void CNullPointCall::Test3(int iTest)
{
    cout << iTest << endl; 
}

void CNullPointCall::Test4()
{
    cout << m_iTest << endl; 
}

Int main()
{
CNullPointCall *pNull = NULL;
    
pNull->Test1(); 
pNull->Test2();
pNull->Test3(13); 
pNull->Test4(); 
}

30 个解决方案

#1


在机子上运行下不就有答案了吗,

#2


你这些题,自己上机试一下不就清楚了

#3


...是啊!! 就是要个分析结果! 答案不重要!

#4


都不难

(1)
0123210-1-2
(2) 
str的值为空
str1的值为10
(3)
0,2
(4)
base
grandson
derived1
derived2
(5)
0
Very Cool!
13
没有分配对象,无法访问

// (5)
#include<iostream>
using namespace std;

class CNullPointCall
{
public:
static void Test1();
void Test2();
void Test3(int iTest);
void Test4();

private:
static int m_iStatic;
int m_iTest;

/* CNullPointCall(){m_iTest=10;};*/

};

int CNullPointCall::m_iStatic = 0;

void CNullPointCall::Test1()
{
cout << m_iStatic << endl;
}

void CNullPointCall::Test2()
{
cout << "Very Cool!" << endl; 
}

void CNullPointCall::Test3(int iTest)
{
cout << iTest << endl; 
}

void CNullPointCall::Test4()
{
cout << m_iTest << endl; 
}

int main()
{
CNullPointCall *pNull = NULL;

pNull->Test1(); 
pNull->Test2();
pNull->Test3(13); 
CNullPointCall obj;
obj.Test4();// 一个随机值
//pNull->Test4(); 
}

#5


(1)
0123210-1-2
这后面的0-1-2是什么原因,有没达人解释下。。看不懂的啊~~

#6


该回复于2011-03-31 14:17:35被版主删除

#7



Question1:
A a(调用A的构造函数num由0加到1)
B b(先调用A的构造函数num由1加到2,然后再调用B的构造函数,num由2加到3)
b.f(b)(在这里本来应该调用A的拷贝构造函数,但是A没有,所以由编译器直接生成,然后对b拷贝A的那部份,实行逐位拷贝,所以这里num没变,接下来,在退出函数时,调用A的构构函数,num由3减到2,接着,调用A的构造函数,析构return那里的临时对象,num此时由2减到1)
在程序退出时,析构b,这里调用B的析构函数,然后是A的析构函数,这时num由1减到-1,然后析构a,num由-1变到-2

Question2:
str的值为空(这个很容易理解)
str1的值为10(string 对象不用'\0'结尾)

Question3:
a>b为假,所以后面的没计算,也就是说n的值还是为2,但是a>b只有0跟1,结果你知道的

Question4:
base
grandson
derived1
derived2
这个主要考是多态,没什么好说的

Question5:
看看下面的这个链接就知道了
http://blog.csdn.net/starlee/archive/2008/01/24/2062586.aspx

cout<<"给力么?yes:or"<<endl;

#8


这些都是考基本功的。lz如果不清楚的话,最好还是去找本书看看吧。不然题目变下,你就不知道怎么答了

#9


要结果上机,要分析看书。

#10


引用 8 楼 luciferisnotsatan 的回复:
这些都是考基本功的。lz如果不清楚的话,最好还是去找本书看看吧。不然题目变下,你就不知道怎么答了

兄台,你能否看下第一题,后面为什么输出0-1-2,这该如何解释,前面的输出我能理解。

#11


引用 10 楼 oldmtn 的回复:
引用 8 楼 luciferisnotsatan 的回复:
这些都是考基本功的。lz如果不清楚的话,最好还是去找本书看看吧。不然题目变下,你就不知道怎么答了

兄台,你能否看下第一题,后面为什么输出0-1-2,这该如何解释,前面的输出我能理解。

最后那是负1和负2,你跟踪就清楚了,到最后,析构函数中num的值已经小于0了

#12


楼主,我现在把第一题搞懂了,后面还是比较简单的。
#include <iostream>
using namespace std;
class A   
{
public:   
static int num;
A() {cout << num++ << " A::A()" << endl;}
~A(){cout << num-- << " A::~A()" << endl;}   
};

int A::num=0;   

class B: public A
{
public:
B(){cout << num++ << " B::B()" << endl;}   
~B(){cout << num-- << " B::~B()" << endl;}   

//void f(A a) 
A f(A a)
{
cout << " B::f()" << endl;
return a;
}   
};

int main()
{
A a;
B b;

//b.f(a);
b.f(b);
system("pause");
return 0;  
}
代码没变,我加入了些查看语句帮助我解释。
结果如下图。。。。。。
高分求教外企c++开发笔试题目答案!
因为第一题涉及编译器临时变量问题。我帮你解释下吧,如有不对,大家多见解下。

首先你看b.f(a);
而在类B中,定义为A f(A a){return a;}
调用该函数时候,这里有个问题就是在C++内部,首先定义一个临时变量A temp_ba = (A)b;这是强制转换,
然后A a = temp_ba,但是这2个临时变量的生命周期很短,在返回的时候要析构,所以调用了2次析构函数。
所以输出了3 A::~A()
         2 A::~A()
然后返回的时候,在main函数内部,虽然我们没有定义一个A变量来接收返回值,但是编译器在main()函数里面定义了A main_temp_a = 这里是那个返回的a;
所以输出了 1 A::~A()
然后程序结束,main函数的A a; B b;的生命周期结束,要析构,这个析构和构造顺序相反。
所以输出了 0  B::~B()
         -1  B::~B()这二句是b析构的
         -2  A::~A()这句是a析构的

#13


抱歉
上述的
首先你看b.f(a);
因该是b.f(b);

大家注意下~~ 高分求教外企c++开发笔试题目答案!

#14


这么的长。。。。

#15


怎么意思?

#16


7L的解释很给力! 高分求教外企c++开发笔试题目答案!

#17


强烈建议作者上机试

#18


大家继续! 我还加分

#19


引用 7 楼 maoxing63570 的回复:
C/C++ code

Question1:
A a(调用A的构造函数num由0加到1)
B b(先调用A的构造函数num由1加到2,然后再调用B的构造函数,num由2加到3)
b.f(b)(在这里本来应该调用A的拷贝构造函数,但是A没有,所以由编译器直接生成,然后对b拷贝A的那部份,实行逐位拷贝,所以这里num没变,接下来,在退出函数时,调用A的构构函数,num由3减到2,接着,调用A……

yes

#20


引用 12 楼 oldmtn 的回复:
楼主,我现在把第一题搞懂了,后面还是比较简单的。
#include <iostream>
using namespace std;
class A  
{
public:  
static int num;
A() {cout << num++ << " A::A()" << endl;}
~A(){cout << num-- << " A::~A()" << endl;}  
……

这位关于中间有两次析构说的对吗?大家继续啊、

#21


引用 10 楼 oldmtn 的回复:
引用 8 楼 luciferisnotsatan 的回复:
这些都是考基本功的。lz如果不清楚的话,最好还是去找本书看看吧。不然题目变下,你就不知道怎么答了

兄台,你能否看下第一题,后面为什么输出0-1-2,这该如何解释,前面的输出我能理解。


A f(A a) {return a;}
  
A f(A a)  这个是按值传递,传参时用了一次拷贝构造函数
return a; 返回时,生成了一个临时变量,又用了一次拷贝构造函数

#22


引用 21 楼 luciferisnotsatan 的回复:
引用 10 楼 oldmtn 的回复:

引用 8 楼 luciferisnotsatan 的回复:
这些都是考基本功的。lz如果不清楚的话,最好还是去找本书看看吧。不然题目变下,你就不知道怎么答了

兄台,你能否看下第一题,后面为什么输出0-1-2,这该如何解释,前面的输出我能理解。


A f(A a) {return a;}
  
A f(A a) 这个是按值传递,传参时……

要的就是这个,看来基本功还是有问题啊。 高分求教外企c++开发笔试题目答案!

#23


该回复于2011-04-01 17:13:10被版主删除

#24


..........要的是思路! 结果不重要!

#25


7楼说的很明白啊

#26


b.f()到底调用了3次析构函数还是2次析构函数?

#27


该回复于2011-04-21 08:53:59被版主删除

#28


大家抓紧啊!

#29


引用 7 楼 maoxing63570 的回复:
C/C++ code

Question1:
A a(调用A的构造函数num由0加到1)
B b(先调用A的构造函数num由1加到2,然后再调用B的构造函数,num由2加到3)
b.f(b)(在这里本来应该调用A的拷贝构造函数,但是A没有,所以由编译器直接生成,然后对b拷贝A的那部份,实行逐位拷贝,所以这里num没变,接下来,在退出函数时,调用A的构构函数,num由3减到2,接着,调用A的构造……


str1.size()  的值 为10 是因为string::size() 这个函数返回的是string::_Mysize  ,这个Mysize是通过strlen得出来的,strlen这个函数不把字符串后面的\0计算到字符串的大小里面,sizeof则把\0也计算到里面。
std::string 的字符串也是以 0x00结尾的。

#30


不会!

#1


在机子上运行下不就有答案了吗,

#2


你这些题,自己上机试一下不就清楚了

#3


...是啊!! 就是要个分析结果! 答案不重要!

#4


都不难

(1)
0123210-1-2
(2) 
str的值为空
str1的值为10
(3)
0,2
(4)
base
grandson
derived1
derived2
(5)
0
Very Cool!
13
没有分配对象,无法访问

// (5)
#include<iostream>
using namespace std;

class CNullPointCall
{
public:
static void Test1();
void Test2();
void Test3(int iTest);
void Test4();

private:
static int m_iStatic;
int m_iTest;

/* CNullPointCall(){m_iTest=10;};*/

};

int CNullPointCall::m_iStatic = 0;

void CNullPointCall::Test1()
{
cout << m_iStatic << endl;
}

void CNullPointCall::Test2()
{
cout << "Very Cool!" << endl; 
}

void CNullPointCall::Test3(int iTest)
{
cout << iTest << endl; 
}

void CNullPointCall::Test4()
{
cout << m_iTest << endl; 
}

int main()
{
CNullPointCall *pNull = NULL;

pNull->Test1(); 
pNull->Test2();
pNull->Test3(13); 
CNullPointCall obj;
obj.Test4();// 一个随机值
//pNull->Test4(); 
}

#5


(1)
0123210-1-2
这后面的0-1-2是什么原因,有没达人解释下。。看不懂的啊~~

#6


该回复于2011-03-31 14:17:35被版主删除

#7



Question1:
A a(调用A的构造函数num由0加到1)
B b(先调用A的构造函数num由1加到2,然后再调用B的构造函数,num由2加到3)
b.f(b)(在这里本来应该调用A的拷贝构造函数,但是A没有,所以由编译器直接生成,然后对b拷贝A的那部份,实行逐位拷贝,所以这里num没变,接下来,在退出函数时,调用A的构构函数,num由3减到2,接着,调用A的构造函数,析构return那里的临时对象,num此时由2减到1)
在程序退出时,析构b,这里调用B的析构函数,然后是A的析构函数,这时num由1减到-1,然后析构a,num由-1变到-2

Question2:
str的值为空(这个很容易理解)
str1的值为10(string 对象不用'\0'结尾)

Question3:
a>b为假,所以后面的没计算,也就是说n的值还是为2,但是a>b只有0跟1,结果你知道的

Question4:
base
grandson
derived1
derived2
这个主要考是多态,没什么好说的

Question5:
看看下面的这个链接就知道了
http://blog.csdn.net/starlee/archive/2008/01/24/2062586.aspx

cout<<"给力么?yes:or"<<endl;

#8


这些都是考基本功的。lz如果不清楚的话,最好还是去找本书看看吧。不然题目变下,你就不知道怎么答了

#9


要结果上机,要分析看书。

#10


引用 8 楼 luciferisnotsatan 的回复:
这些都是考基本功的。lz如果不清楚的话,最好还是去找本书看看吧。不然题目变下,你就不知道怎么答了

兄台,你能否看下第一题,后面为什么输出0-1-2,这该如何解释,前面的输出我能理解。

#11


引用 10 楼 oldmtn 的回复:
引用 8 楼 luciferisnotsatan 的回复:
这些都是考基本功的。lz如果不清楚的话,最好还是去找本书看看吧。不然题目变下,你就不知道怎么答了

兄台,你能否看下第一题,后面为什么输出0-1-2,这该如何解释,前面的输出我能理解。

最后那是负1和负2,你跟踪就清楚了,到最后,析构函数中num的值已经小于0了

#12


楼主,我现在把第一题搞懂了,后面还是比较简单的。
#include <iostream>
using namespace std;
class A   
{
public:   
static int num;
A() {cout << num++ << " A::A()" << endl;}
~A(){cout << num-- << " A::~A()" << endl;}   
};

int A::num=0;   

class B: public A
{
public:
B(){cout << num++ << " B::B()" << endl;}   
~B(){cout << num-- << " B::~B()" << endl;}   

//void f(A a) 
A f(A a)
{
cout << " B::f()" << endl;
return a;
}   
};

int main()
{
A a;
B b;

//b.f(a);
b.f(b);
system("pause");
return 0;  
}
代码没变,我加入了些查看语句帮助我解释。
结果如下图。。。。。。
高分求教外企c++开发笔试题目答案!
因为第一题涉及编译器临时变量问题。我帮你解释下吧,如有不对,大家多见解下。

首先你看b.f(a);
而在类B中,定义为A f(A a){return a;}
调用该函数时候,这里有个问题就是在C++内部,首先定义一个临时变量A temp_ba = (A)b;这是强制转换,
然后A a = temp_ba,但是这2个临时变量的生命周期很短,在返回的时候要析构,所以调用了2次析构函数。
所以输出了3 A::~A()
         2 A::~A()
然后返回的时候,在main函数内部,虽然我们没有定义一个A变量来接收返回值,但是编译器在main()函数里面定义了A main_temp_a = 这里是那个返回的a;
所以输出了 1 A::~A()
然后程序结束,main函数的A a; B b;的生命周期结束,要析构,这个析构和构造顺序相反。
所以输出了 0  B::~B()
         -1  B::~B()这二句是b析构的
         -2  A::~A()这句是a析构的

#13


抱歉
上述的
首先你看b.f(a);
因该是b.f(b);

大家注意下~~ 高分求教外企c++开发笔试题目答案!

#14


这么的长。。。。

#15


怎么意思?

#16


7L的解释很给力! 高分求教外企c++开发笔试题目答案!

#17


强烈建议作者上机试

#18


大家继续! 我还加分

#19


引用 7 楼 maoxing63570 的回复:
C/C++ code

Question1:
A a(调用A的构造函数num由0加到1)
B b(先调用A的构造函数num由1加到2,然后再调用B的构造函数,num由2加到3)
b.f(b)(在这里本来应该调用A的拷贝构造函数,但是A没有,所以由编译器直接生成,然后对b拷贝A的那部份,实行逐位拷贝,所以这里num没变,接下来,在退出函数时,调用A的构构函数,num由3减到2,接着,调用A……

yes

#20


引用 12 楼 oldmtn 的回复:
楼主,我现在把第一题搞懂了,后面还是比较简单的。
#include <iostream>
using namespace std;
class A  
{
public:  
static int num;
A() {cout << num++ << " A::A()" << endl;}
~A(){cout << num-- << " A::~A()" << endl;}  
……

这位关于中间有两次析构说的对吗?大家继续啊、

#21


引用 10 楼 oldmtn 的回复:
引用 8 楼 luciferisnotsatan 的回复:
这些都是考基本功的。lz如果不清楚的话,最好还是去找本书看看吧。不然题目变下,你就不知道怎么答了

兄台,你能否看下第一题,后面为什么输出0-1-2,这该如何解释,前面的输出我能理解。


A f(A a) {return a;}
  
A f(A a)  这个是按值传递,传参时用了一次拷贝构造函数
return a; 返回时,生成了一个临时变量,又用了一次拷贝构造函数

#22


引用 21 楼 luciferisnotsatan 的回复:
引用 10 楼 oldmtn 的回复:

引用 8 楼 luciferisnotsatan 的回复:
这些都是考基本功的。lz如果不清楚的话,最好还是去找本书看看吧。不然题目变下,你就不知道怎么答了

兄台,你能否看下第一题,后面为什么输出0-1-2,这该如何解释,前面的输出我能理解。


A f(A a) {return a;}
  
A f(A a) 这个是按值传递,传参时……

要的就是这个,看来基本功还是有问题啊。 高分求教外企c++开发笔试题目答案!

#23


该回复于2011-04-01 17:13:10被版主删除

#24


..........要的是思路! 结果不重要!

#25


7楼说的很明白啊

#26


b.f()到底调用了3次析构函数还是2次析构函数?

#27


该回复于2011-04-21 08:53:59被版主删除

#28


大家抓紧啊!

#29


引用 7 楼 maoxing63570 的回复:
C/C++ code

Question1:
A a(调用A的构造函数num由0加到1)
B b(先调用A的构造函数num由1加到2,然后再调用B的构造函数,num由2加到3)
b.f(b)(在这里本来应该调用A的拷贝构造函数,但是A没有,所以由编译器直接生成,然后对b拷贝A的那部份,实行逐位拷贝,所以这里num没变,接下来,在退出函数时,调用A的构构函数,num由3减到2,接着,调用A的构造……


str1.size()  的值 为10 是因为string::size() 这个函数返回的是string::_Mysize  ,这个Mysize是通过strlen得出来的,strlen这个函数不把字符串后面的\0计算到字符串的大小里面,sizeof则把\0也计算到里面。
std::string 的字符串也是以 0x00结尾的。

#30


不会!