您的位置:首页 > 编程语言 > C语言/C++

【C/C++】成员变量

2015-08-29 19:38 337 查看
问题1:

哪一种成员变量可以在同一个类的实例之间共享?

问题2:

指出下面程序的错误。如果把静态成员数据设为私有,该如何访问?

#include <iostream>
using namespace std;

class Cat
{
public:
Cat(int age):itsAge(age) { HowManyCats++; }
virtual ~Cat() { HowManyCats--; }
virtual int GetAge() { return itsAge; }
virtual void SetAge(int age) { itsAge = age; }
static int HowManyCats;
private:
int itsAge;
};

int main()
{
const int MaxCats = 5;
int i = 1;
Cat *CatHouse[MaxCats];
for (i = 0; i < MaxCats; i++)
CatHouse[i] = new Cat(i);
for (i = 0; i < MaxCats; i++)
{
cout << "There are ";
cout << Cat::HowManyCats;
cout << " cats left!\n";
cout << "Deleting the one which is ";
cout << CatHouse[i]->GetAge(); ;
cout << " years old\n";
delete CatHouse[i];
CatHouse[i] = 0;
}
return 0;
}


问题3:

请问下面程序打印出的结果是什么?

#include <iostream>
#include <string>
using namespace std;

class base
{
private :
int m_i;
int m_j;
public :
base(int i) : m_j(i), m_i(m_j) {}
base() : m_j(0), m_i(m_j) {}
int get_i() { return m_i; }
int get_j() { return m_j; }
};

int main(int argc, char* argv[])
{
base obj(98);
cout << obj.get_i() << endl << obj.get_j() << endl;
return 0;
}


问题4:

这个类声明正确吗?为什么?

class A
{
const int Size = 9;
}


=======================================================================================

问题1答案:必须使用静态成员变量在一个类的所有实例间共享数据。如果想限制对静态成员变量的访问,则必须把它们声明为保护型或私有型。不允许用静态成员变量去存放某个对象的数据。静态成员数据是在这个类的所有对象间共享的。

问题2答案:该程序错在设定了静态成员变量,却没有给静态成员变量赋初值。如果把静态成员数据设为私有,可以通过公有静态成员函数访问。

#include <iostream>
using namespace std;

class Cat
{
public:
Cat(int age):itsAge(age) { HowManyCats++; }
virtual ~Cat() { HowManyCats--; }
virtual int GetAge() { return itsAge; }
virtual void SetAge(int age) { itsAge = age; }
static int GetHowMany() { return HowManyCats; }
// static int HowManyCats;
private:
int itsAge;
static int HowManyCats;
};

int Cat::HowManyCats = 0;

void tele();

int main()
{
const int MaxCats = 5;
int i = 1;
Cat *CatHouse[MaxCats];
for (i = 0; i < MaxCats; i++)
CatHouse[i] = new Cat(i);
for (i = 0; i < MaxCats; i++)
{
delete CatHouse[i];
tele();
}
return 0;
}

void tele()
{
cout << "There are " << Cat::GetHowMany() << " Cats alive!\n";
}
问题3解析:

本题想要得到的结果是“98,98”。但是成员变量的声明先是m_i,然后是m_j;初始化列表的初始化变量顺序是根据成员变量的声明顺序来执行的,因此m_i会被赋予一个随机值。更改一下成员变量的声明顺序可以得到预想的结果。如果要得到“98,98”的输出结果,程序需要修改如下:

#include <iostream>
#include <string>
using namespace std;

class base
{
private :
int m_j;	// 修改成员变量声明顺序
int m_i;

public :
base(int i) : m_j(i), m_i(m_j) {}
base() : m_j(0), m_i(m_j) {}
int get_i() { return m_i; }
int get_j() { return m_j; }
};

int main(int argc, char* argv[])
{
base obj(98);
cout << obj.get_i() << endl << obj.get_j() << endl;
return 0;
}
答案:输出结果第一个为随机数,第二个是98。

问题4解析:

这道程序题存在着成员变量问题。常量必须在构造函数的初始化列表里面初始化或者将其设置为static。

答案:

正确的程序如下:

class A
{
A()
{
const int Size = 9;
}
};
或者:

class A
{
static const int Size = 9;
};

此外,还可以使用枚举来定义常量 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: