问题1:
structure是否可以拥有constructor/destructor及成员函数?如果可以,那么structure和class还有什么区别么?
问题2:
现有以下代码,则编译时会产生错误的是()。
struct Test
{
Test(int) {}
Test() {}
void fun() {}
};
int main()
{
Test a(1); // 语句1
a.fun(); // 语句2
Test b(); // 语句3
b.fun(); // 语句4
return 0;
}
A. 语句1
B. 语句2
C. 语句3
D. 语句4
======================================================================================
问题1解析:
答案:区别是class中变量默认值为private,struct中的变量默认public。struct可以有构造函数、析构函数,之间也可以继承,等等。C++中的struct其实和class意义一样,唯一不同的就是struct里面默认的访问控制是public,class中默认的访问控制是private。C++中保存struct关键字的唯一意义就是为了让C程序员有个归属感,是为了让C++编译器兼容以前用C开发的项目。
扩展知识:
我们可以写一段struct继承的例子,代码如下:
#include <iostream>
using namespace std;
enum BREED {GOLDEN, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAB};
struct Mammal
{
public :
Mammal(): itsAge(2), itsWeight(5) {}
~Mammal() {}
int GetAge() const { return itsAge; }
void SetAge(int age) { itsAge = age; }
int GetWeight() const { return itsWeight; }
void SetWeight(int weight) { itsWeight = weight; }
void Speak() const { cout << "\nMammal sound!"; }
void Sleep() const { cout << "\nMammal sleep."; }
protected :
int itsAge;
int itsWeight;
};
struct Dog : public Mammal
{
public :
Dog(): itsBreed(GOLDEN) {}
~Dog() {}
BREED GetBreed() const { return itsBreed; }
void SetBreed(BREED breed) { itsBreed = breed; }
void WagTail() const { cout << "Tail wagging...\n"; }
void BegForFood() const { cout << "Begging for food...\n"; }
private :
BREED itsBreed;
};
int main()
{
Dog fido;
fido.Speak();
fido.WagTail();
cout << "Fido is " << fido.GetAge() << " years old \n";
return 0;
}
问题2解析:
Test b()这个语法等同于声明了一个函数,函数名为b,返回值为Test,传入参数为空。但实际上,代码作者是希望声明一个类型为Test,变量为b的变量,应该写成Test b;,但程序中这个错误在编译时是检测不出来的。出错的是语句4“b.fun();”,它是编译不过去的。
答案:D