2024/2/6

第五章  静态成员与友元

一、填空题

    1、一个类的头文件如下所示,num初始化值为5,程序产生对象T,且修改num为10,并使用show()函数输出num的值10。

#include <iostream.h>

class Test

{ private:

static int num;

public:

Test(int);

void show();

};

_int num=5;________

Test::Test(int n)

{ num=n; }

void Test::show()

{ cout<<num<<endl; }

void main()

{ Test t(10);

___t.show();______

}

  2 、在下面程序的底画线处填上适当的字句,使该程序执行结果为40。

#include <iostream>

class Test

{ public:

___static int x___;

Test (int i=0)

{x=i+x;}

int Getnum()

{return Test::x+7;}

};

___int Test::x = 33____;

void main()

{Test test;

cout<<test.Getnum()<<endl;;

}

3 、下列程序运行的结果是_

姓名    成绩   等级

张三     78      中

李四     92      优

王五     62      及格

孙六     88      良

_

     #include <iostream.h>

#include <string.h>

#include <iomanip.h>

class student

{char name[8];

int deg;

char level[7];

friend class process; // 说明友元类

public:

student(char na[],int d)

{ strcpy(name,na);

deg=d;

}

};

class process

{ public:

void trans(student &s)

{int i=s.deg/10;

switch(i)

{case 9:

strcpy(s.level, "优");break;

case 8:

strcpy(s.level,"良");break;

case 7:

strcpy(s.level,"中");break;

case 6:

strcpy(s.level,"及格");break;

default:

strcpy(s.level,"不及格");

}

}

void show(student &s)

{cout<<setw(10)<<s.name<<setw(4)<<s.deg<<setw(8)<<s.level<<endl;}

};

void main()

{ student st[]={student("张三",78),student("李四",92),student("王五

",62),student("孙六",88)};

process p;

cout<<"结 果:"<<"姓名"<<setw(6)<<"成绩"<<setw(8)<<"等级"<<endl;

for(int i=0;i<4;i++)

{ p.trans(st[i]);

p.show(st[i]);}

}

二、编程题

1.

 (1) 编写一个类,声明一个数据成员和一个静态数据成员。让构造函数初始化数据成员,并把静态数据成员加1,让析构函数把静态数据成员减1。

 (2) 根据(1)编写一个应用程序,创建三个对象,然后显示它们的数据成员和静态数据成员,再析构每个对象,并显示它们对静态数据成员的影响。

 (3) 修改(2),让静态成员函数访问静态数据成员,并让静态数据成员是保户的。

2. 

 (1) 下述代码有何错误,改正它。

#include < iostream>

using namespace std;

class Animal;

void SetValue(Animal&, int);

void SetValue(Animal&, int, int);

class Animal

{

public:

    friend void SetValue(Animal&, int);

protected:

int itsWeight;

int itsAge;

};

void SetValue(Animal& ta, int tw)

{

    a.itsWeight = tw;

}

void SetValue(Animal& ta, int tw, int tn)

{

    ta.itsWeight = tw;

    ta.itsAge = tn;

}

int main()

{

    Animal peppy;

    SetValue(peppy, 5);

    SetValue(peppy, 7,9);

return 0;

}

 (2) 将上面程序中的友员改成普通函数,为此增加访问类中保护数据的成员函数。

答:

(1)void SetValue(Animal& ta, int tw, int tn)无法访问类中被保护的成员

改:在类中加上friend void SetValue(Animal& ta, int tw, int tn)

(2)

void AnimalSetValue(Animal& ta, int tw)

{
    ta.itsWeight = tw;

}

3. 重新编写下述程序,使函数Leisure()成为类Car和类Boat的函数。作为重新编程,在类Car和类Boat中,增加函数set()。

#include < iostream>

using namespace std;

class Boat;

class Car

{

public:

    Car(int j){size = j;}

    friend int Leisure(int time, Car& aobj, Boat& bobi);

protected:

    int size;

class Boat

{

public:

    Boat(int j){size = j;}

    friend int Leisure(int time, Car& aobj, Boat& bobj);

protected:

    int size;

};

int Leisure(int time, Car& aobj, Boat& bobi)

{

    return time * aobj.size *bobi.size;

}

};

int main()

{

    Car c1(2);

    Boat bl(3);

    int time = 4;

    cout << Leisure(time, cl,bl);

return 0;

}

#include <iostream>

using namespace std;

class Boat; // 前向声明

class Car {

public:

    Car(int j) { size = j; }

    int Leisure(int time, Boat& bobj);

    void set(int j) { size = j; }

    int getSize() { return size; } // 公有访问函数

private:

    int size;

};

class Boat {

public:

    Boat(int j) { size = j; }

    int Leisure(int time, Car& aobj);

    void set(int j) { size = j; }

    int getSize() { return size; } // 公有访问函数

private:

    int size;

};

int Car::Leisure(int time, Boat& bobj) {

    return time * getSize() * bobj.getSize(); // 使用公有访问函数

}

int Boat::Leisure(int time, Car& aobj) {

    return time * getSize() * aobj.getSize(); // 使用公有访问函数

}

int main() {

    Car c1(2);

    Boat bl(3);

    int time = 4;

    cout << c1.Leisure(time, bl) << endl;

    return 0;

}

在SQL Server中,如果你想要将特定格式的日期和时间字符串转换为另一种格式,可以使用`CONVERT()`函数或`FORMAT()`函数(在SQL Server 2012及更高版本中可用)来进行日期时间的格式化。 以你提供的格式为例,若要将"2024/06/03 9:15:16"转换为"2024/6/2 8:19:16",需要注意的是,原格式中的月份是两位数字,而你想要的格式中月份是一位数字;此外,小时数也要相应调整。下面提供转换方法: 使用`CONVERT()`函数: ```sql SELECT REPLACE(CONVERT(VARCHAR, GETDATE(), 113), '-', '/') AS NewDateTimeFormat; ``` 这将输出形如"2024/06/03 9:15:16"的日期时间格式。但是,要注意的是,`CONVERT()`函数中的样式代码`113`返回的是`YYYYMMDDHHMMSS.MS`格式,即日期和时间之间没有分隔符,而且月份仍然是两位数字。 对于你的需求,我们可能需要进一步使用字符串函数(如`REPLACE`)来手动调整格式: ```sql SELECT REPLACE(CONVERT(VARCHAR, GETDATE(), 121), '-', '/') + ' ' + STUFF(STUFF(CONVERT(VARCHAR, GETDATE(), 120), 3, 0, ':'), 6, 0, ':') AS CustomDateTimeFormat; ``` 这段代码首先将日期时间转换为"YYYY-MM-DD HH:MM:SS"格式,然后替换日期分隔符为斜杠,并且使用`STUFF`函数将时间分隔符调整到适当的位置,最终生成"YYYY/MM/DD HH:MM:SS"的格式。但仍然无法直接达到你想要的"2024/6/2 8:19:16"格式,因为它涉及到日期的减法处理,这通常需要额外的逻辑来计算。 如果你需要精确控制日期和时间的每一位,你可能需要编写更复杂的字符串处理逻辑,或者将日期时间转换为`DATETIME`或`DATETIME2`类型,然后使用`DATEADD`和`DATEDIFF`函数来手动调整日期和时间的各个部分。 由于SQL Server中不提供直接减去一定天数的功能,若要实现特定的日期调整(例如,减去一天),需要根据具体情况进行计算。例如,使用`DATEADD`函数: ```sql SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()) - 1, 0) AS PreviousDay, DATEADD(hour, DATEDIFF(hour, 0, GETDATE()) - 1, 0) AS PreviousHour, DATEADD(minute, DATEDIFF(minute, 0, GETDATE()) - 1, 0) AS PreviousMinute; ``` 以上代码分别计算了前一天、前一个小时和前一分钟的时间点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值