【C/C++】成员变量

问题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; 
};

此外,还可以使用枚举来定义常量 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值