第7周-任务1-静态数据成员和静态成员函数

【题目】含有静态数据成员和成员函数的Time类:类中所有的对象共有的数据

class Time
{
public:
    Time(int=0,int=0,int=0);
    void show_time( );//根据is_24和from0,输出适合形式-20:23:5/8:23:5 pm/08:23:05 pm
    voidadd_seconds(int); //增加n秒钟
    voidadd_minutes(int); //增加n分钟
    void add_hours(int);//增加n小时
    static voidchange24();  //改变静态成员is_24,在12和24时制之间转换
    static voidchangefrom0();   //改变静态成员from0,切换是否前导0
 private:
    static bool is_24;//为true时,24小时制,如20:23:5;为flase,12小时制,显示为8:23:5 pm
    staticbool from0; //为true时,前导0,8:23:5显示为08:23:05
    int hour;
    int minute;
    int sec;
};
//下面写出静态成员的初始化及各成员函数的定义
……
int main( )
{  }

【讲解视频】

【参考解答】

#include <iostream>
using namespace std;
class Time
{
public:
	Time(int=0,int=0,int=0);
	void show_time( ); //根据is_24和from0,输出适合形式的时间20:23:5/8:23:5 pm/08:23:05 pm
	void add_seconds(int); //增加n秒钟
	void add_minutes(int); //增加n分钟
	void add_hours(int); //增加n小时
	static void change24();  //改变静态成员is_24,在12和24时制之间转换
	static void changefrom0();   //改变静态成员from0,转换是否前导0
private:
	static bool is_24; //为true时,24小时制,如20:23:5;为flase,12小时制,显示为8:23:5 pm
	static bool from0; //为true时,前导0,8:23:5显示为08:23:05
	int hour;
	int minute;
	int sec;
};
bool Time::is_24=true;
bool Time::from0=false;

Time::Time(int h,int m,int s): hour(h), minute(m), sec(s){}

void Time::show_time( )     //不要一遇到需要分情况讨论时就直接用if-else,换一种角度,写出简洁的程序来
{
	//输出 时
        int h=(is_24)?hour:hour%12;  //这样写比下面的简洁
	//if(is_24)   //不要写作if(is_24==true)。对,但显得有些太菜
	//	h=hour;
	//else
	//	h=hour%12;
	if (h<10 && from0) cout<<'0';   //写成if (h<10 && from0==true)...就显菜了
	cout<<h<<':';

        //输出 分
	if(minute<10 && from0) cout<<'0';
	cout<<minute<<':';

        //输出 秒
	if(sec<10&&from0) cout<<'0';
	cout<<sec; 

	 //输出pm或am
	if(!is_24)  //比写if(is_24==false)...强
		cout<<(hour>12)? " pm":" am";//这样写比下面的简洁

		//if (hour>12)
		//	cout<<" pm";
		//else
		//	cout<<" am";
	cout<<endl;
}

void Time::add_seconds(int n) //增加n秒钟
{
	sec+=n;
	if (sec>59)
	{
		add_minutes(sec/60);
		sec%=60;
	}
}  

void Time::add_minutes(int n) //增加n分钟
{
	minute+=n;
	if (minute>59)
	{
		add_hours(minute/60);
		minute%=60;
	}
}  

void Time::add_hours(int n) //增加n小时
{
	hour+=n;
	if (hour>23)
		hour%=24;
}  

void Time::change24()
{
	is_24=!is_24;
}
void Time::changefrom0()
{
	from0=!from0;
}

int main( )
{
	Time t1(23,14,25),t2(8,45,6);
	cout<<"24时制, 不前导0:"<<endl;
	cout<<"    t1是:";
	t1.show_time();
	cout<<"    t2是:";
	t2.show_time();
	t1.add_hours(10);
	t2.add_hours(10);
	Time::changefrom0(); //注意此处调用静态成员
	cout<<"10小时后, 切换是否前导0:"<<endl;
	cout<<    "t1是:";
	t1.show_time();
	cout<<    "t2是:";
	t2.show_time();
	t1.change24();
	cout<<"换一种制式:"<<endl;
	cout<<"    t1是:";
	t1.show_time();
	cout<<"    t2是:";
	t2.show_time();
	system("pause");
	return 0;
}

  本题目中,不少同学将show_time()函数编得过分繁杂。受is_24和from0两种方式控制就给出了4种组合,然后用if-else一一处理。如果再规定时间的各部分可以用冒号(:)隔开,也可以用减号(-)隔开,是否要给出8种组合?再引入其他更多的方式呢?所以,要试着换种角度想问题,编出短小精干的程序来。

 

时间: 2024-09-20 16:57:22

第7周-任务1-静态数据成员和静态成员函数的相关文章

C++类静态数据成员与类静态成员函数

在没有讲述本章内容之前如果我们想要在一个范围内共享某一个数据,那么我们会设立全局对象,但面向对象的程序是由对象构成的,我们如何才能在类范围内共享数据呢? 这个问题便是本章的重点: 声明为static的类成员或者成员函数便能在类的范围内共同享,我们把这样的成员称做静态成员和静态成员函数. 下面我们用几个实例来说明这个问题,类的成员需要保护,通常情况下为了不违背类的封装特性,我们是把类成员设置为protected(保护状态)的,但是我们为了简化代码,使要说明的问题更为直观,更容易理解,我们在此处都设

mfc-MFC 静态数据成员初始化

问题描述 MFC 静态数据成员初始化 要用到AfxBeginThread(threadproc,.....),函数threadproc()必须为静态函数,我使用这个函数需要调用 如下静态成员 但是我只能在 .cpp文件外部初始化为空.请问应该在哪给他们赋上后面的值,还是我的思路有问题. pStc=(CStatic *)GetDlgItem(IDC_STATIC); pStc->GetClientRect(&rect): pDC=pStc->GetDC(); hDC=pDC->Ge

c c++编程-c++关于静态数据成员的问题,看以下程序,会输出什么数字,过程是什么

问题描述 c++关于静态数据成员的问题,看以下程序,会输出什么数字,过程是什么 解决方案 打印出221 Obj obj1; //会调用构造,所以i++了(变为1了) f(); //调用函数f(),在函数内定义了一个对象,也会调用构造,i++了(变为2了),打印出第一个数字2, //打印完以后,f()函数结束了,obj2离开了作用域,调用析构i--了(变为1了) Obj *obj3 = new Obj;//会调用构造,所以i++了(变为2了) cout << obj3->getVal();

C++类中的常数据成员与静态数据成员之间的区别_C 语言

刚开始学习C++的类和对象的部分,对类中的常数据成员和静态数据成员的概念和用法经常混淆,所以今天整理一下,顺便说一下,今天是我的生日,祝我生日快乐,呵呵. 常数据成员常数据成员是指在类中定义的不能修改其值的一些数据成员,类似于我们以前学过的常变量,虽然是变量,也有自己的地址,但是一经赋初值,便不能再被修改. 适用于类中定义一些初始化之后不希望被修改的变量. 定义方法: 复制代码 代码如下: const 类型名 变量名; (1)类中的常数据成员只能通过构造函数的参数初始化表进行初始化. (2)常数

c# static 静态数据成员_实用技巧

① 静态成员属于类所有,非静态成员属于类的实例所有. ② 每创建一个类的实例,都市在内存中为非静(动)态成员新分派一块存储: 静态成员属于类所有,为各个类的实例所公用,无论类创建了几多实例,类的静态成员在内存中只占同一块区域. 静态数据成员区别于动态数据成员,静态变量并不是稳定的,只是静态变量在声明的时候不管有没有赋值,都市凭据它的类型分派对应的内存空间,他的可访问性和作用区间与动态变量是一样的 ==================================================

C++静态数据成员实现

静态数据成员是在一个类中用关键字static声明的数据成员.在C++中,一般使用静态成员来代替C语言的全局变量,以达到数据共享.C和C++的全局变量有一定的局限性,可以任意被修改,也容易和其它的变量名冲突,故在C++中,一般不使用全局变量. 静态数据成员必须进行初始化,初始化应在类体外进行,静态数据成员也可以引用,但不能引用私有数据部分. 接下来看一个例子: #include <iostream> #include <cstring> using namespace std ; c

c#匿名方法的静态数据成员和实例数据成员用法

匿名方法总是以一个delegate关键字开始,后面跟着用在方法和方法体(the method body)本身中的参数.正如从上面示例中所见,用户不需要确定匿名方法的返回类型.它(译注:指返回类型)由方法体中的return语句推断而来..NET CLR不能执行像匿名方法一样的自由流(free flowing)代码块.CLR要求:它执行的每个方法是一个类型的一部分,并且应该是一个静态(static)方法或实例(instance)方法(译注:若一个方法声明中含有 static 修饰符,则称该方法为静态

C++ 类,如何用类似字符串的东西定义一个数据成员?

问题描述 C++ 类,如何用类似字符串的东西定义一个数据成员? 题目:设计一个书类,能够保存书名.定价,所有书的本数和总价. 为了实现这一要求,可以将书名.定价设计为普通数据成员,将书的本数和总价设计为静态数据成员.(如何实现题目中的书名?) 如: class book{ public: book()//构造函数,怎样定义一个名字 void show()://cout名字 private: //怎样定义一个名字 } void main{ book a();//对象a,输入一个名字: } 求各位赐

详解C++编程中的静态成员与可变数据成员_C 语言

静态成员类可以包含静态成员数据和成员函数.当数据成员被声明为"静态"时,只会为类的所有对象保留一个数据副本. 静态数据成员不是给定的类类型的对象的一部分.因此,静态数据成员的声明不被视为一个定义.在类范围中声明数据成员,但在文件范围内执行定义.这些静态类成员具有外部链接.下面的示例阐释了这一点: // static_data_members.cpp class BufferedOutput { public: // Return number of bytes written by a