#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
没有分配对象,无法访问
(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是什么原因,有没达人解释下。。看不懂的啊~~
0123210-1-2
这后面的0-1-2是什么原因,有没达人解释下。。看不懂的啊~~
#6
#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
兄台,你能否看下第一题,后面为什么输出0-1-2,这该如何解释,前面的输出我能理解。
#11
最后那是负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;
}
代码没变,我加入了些查看语句帮助我解释。
结果如下图。。。。。。
因为第一题涉及编译器临时变量问题。我帮你解释下吧,如有不对,大家多见解下。
首先你看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析构的
#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;
}
代码没变,我加入了些查看语句帮助我解释。
结果如下图。。。。。。
因为第一题涉及编译器临时变量问题。我帮你解释下吧,如有不对,大家多见解下。
首先你看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);
大家注意下~~
上述的
首先你看b.f(a);
因该是b.f(b);
大家注意下~~
#14
这么的长。。。。
#15
怎么意思?
#16
7L的解释很给力!
#17
强烈建议作者上机试
#18
大家继续! 我还加分
#19
yes
#20
这位关于中间有两次析构说的对吗?大家继续啊、
#21
A f(A a) {return a;}
A f(A a) 这个是按值传递,传参时用了一次拷贝构造函数
return a; 返回时,生成了一个临时变量,又用了一次拷贝构造函数
#22
要的就是这个,看来基本功还是有问题啊。
#23
#24
..........要的是思路! 结果不重要!
#25
7楼说的很明白啊
#26
b.f()到底调用了3次析构函数还是2次析构函数?
#27
#28
大家抓紧啊!
#29
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
没有分配对象,无法访问
(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是什么原因,有没达人解释下。。看不懂的啊~~
0123210-1-2
这后面的0-1-2是什么原因,有没达人解释下。。看不懂的啊~~
#6
#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
兄台,你能否看下第一题,后面为什么输出0-1-2,这该如何解释,前面的输出我能理解。
#11
最后那是负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;
}
代码没变,我加入了些查看语句帮助我解释。
结果如下图。。。。。。
因为第一题涉及编译器临时变量问题。我帮你解释下吧,如有不对,大家多见解下。
首先你看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析构的
#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;
}
代码没变,我加入了些查看语句帮助我解释。
结果如下图。。。。。。
因为第一题涉及编译器临时变量问题。我帮你解释下吧,如有不对,大家多见解下。
首先你看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);
大家注意下~~
上述的
首先你看b.f(a);
因该是b.f(b);
大家注意下~~
#14
这么的长。。。。
#15
怎么意思?
#16
7L的解释很给力!
#17
强烈建议作者上机试
#18
大家继续! 我还加分
#19
yes
#20
这位关于中间有两次析构说的对吗?大家继续啊、
#21
A f(A a) {return a;}
A f(A a) 这个是按值传递,传参时用了一次拷贝构造函数
return a; 返回时,生成了一个临时变量,又用了一次拷贝构造函数
#22
要的就是这个,看来基本功还是有问题啊。
#23
#24
..........要的是思路! 结果不重要!
#25
7楼说的很明白啊
#26
b.f()到底调用了3次析构函数还是2次析构函数?
#27
#28
大家抓紧啊!
#29
str1.size() 的值 为10 是因为string::size() 这个函数返回的是string::_Mysize ,这个Mysize是通过strlen得出来的,strlen这个函数不把字符串后面的\0计算到字符串的大小里面,sizeof则把\0也计算到里面。
std::string 的字符串也是以 0x00结尾的。
#30
不会!