首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
请打开考生文件夹下的解决方案文件proj3,其中定义了一个字符串变量类StringVar。类成员的说明在程序注释中。请在//********333********和//********666********之间填写StringVar成员函数和友元函数的实现
请打开考生文件夹下的解决方案文件proj3,其中定义了一个字符串变量类StringVar。类成员的说明在程序注释中。请在//********333********和//********666********之间填写StringVar成员函数和友元函数的实现
admin
2021-09-05
44
问题
请打开考生文件夹下的解决方案文件proj3,其中定义了一个字符串变量类StringVar。类成员的说明在程序注释中。请在//********333********和//********666********之间填写StringVar成员函数和友元函数的实现代码。在main函数中给出了一组测试数据,运行时输入:
Hello Kitty
此情况下程序的输出应该是:
Hello Kitty
Borg
Borg
注意:只需在//********333********和//********666********之间填入 所编写的若干语句,不要改动程序中的其他内容。
//StringVar.h
#include<ioStream>
#include<cstdlib>
#include<cstddef>
#include<cstring>
using namespace std;
VOid writeToFile(const char*path);
class StringVar
{
public:
StringVar(int size);//构造函数,size为字符串长度(字符个数)初始值;字符串内容初始化为空串
StringVar(const char a[ ]);//构造函数,用参数数组a的内容初始化当前对象
StringVar(const StringVar&strobj);//复制构造函数
~StringVar( ){delete[ ]value;};//析构函数
int length( )const{returnstrlen(value);}
//从输入流ins输入一个字符串,其中可以包括空格
void input_line(istream&ins);
//返回字符串首地址
char*getValue( )const{return value;}
private:
char*value;//字符串首地址
int max_length;//字符串最大长度(字符个数最大值)
};
//将the string通过输出流outs输出
ostream&operator<<(ostream&outs,
const StringVar the_string);
//main.cpp
#include<iostream>
#include<string>
#include"StringVar.h"
//********333********
//********666********
int main( )
{
StringVar namel(30),name2("Borg");
name1.input_line(cin);
StringVar name3(name2);
cout<<name1<<endl;
cout<<name2<<endl;
cout<<name3<<endl;
writeToFile(".\\");
return0;
}
//writeToFile.cpp
#include<iostream>
#include<fstream>
#include<SStream>
#include<string>
using namespace std;
#include"StringVar.h"
void writeToFile(const char*path)
{
char filename[30];
strcpy(filename,path);
strcat(filename,"out.dat");
ofstream fout(filename);
istringstream is (string("Jenny Zheng"));
StringVar name1(40),name2("John");
name1.input line(is);
StringVar name3(name2);
fout<<name1<<name2<<name3;
fout.close( );
}
选项
答案
StringVar::StringVar(int size):max_length(size)//使用成员初始化列表初始化max_length { value=new char[size]; value[0]=’\0’; } StringVar::StringVar(constchar a[ ]) { max_length=strlen(a)+1; value=new char[max_length]; Strcpy(value,a); } StringVar::StringVar(constStringVar&strobj) { max_length=strobj.max_length; value=new char[strlen(strobj.value)+1]; strcpy(value,strobj.value); } void StringVar::input_line(istream&ins) { int i=0; char ch; while(i<max length-1&&(ch=ins.get( ))!=’\n’) { value[i++]=ch; } value[i]=’\0’; } ostream&operator<<(ostream&outs,const StringVar the_string) { outs<<the_string.getValue( )<<endl; return outs; }
解析
由StringVar.h这个头文件可知:头文件中定义了StringVar类,它包含的成员信息如下:
两个数据成员:char*类型的value,指向字符串的首地址;int类型的max_length,表示字符串的最大长度。两个构造函数:接收int类型的构造函数和接收const char a[ ]的构造函数。一个复制构造函数:用参数strobj对象的成员值给当前对象的成员赋值;
析构函数:使用delete[ ]释放value指向的地址空间;length( )成员函数:返回成员value指向的字符串长度;input_line( )成员函数:使用输入流参数输入一个字符串,保存到value指向的内存空间;getValue( )成员函数:常成员函数,返回value的值。
另外类定义体外部还声明一个重载“<<”运算符函数,将StringVar对象中value指向的字符串输出,并返回输出流outs的引用
StringVar.h中,已经给出的定义有:析构函数、length( )函数和getValue( )函数,所以需要我们完成的函数定义有:构造函数、复制构造函数、input_line( )函数和重载的“<<”运算符函数
①StringVar(int size);
题意指出,size为字符串长度(字符个数)初始值,字符串内容初始化为空串,所以需要使用size设置成员max_length,为value申请size个字符的存储空间,并把value的第一个字符设置为’\0’表示空串,这样保证析构函数的delete[ ]也是正确的。
②StringVar(const char a[ ]);
题意指出,使用参数数组a的内容初始化对象的成员,即将数组a中的内容,存放到value指向的内存空间,由于value是使用new分配的(保证析构函数的delete[ ]是正确的),所以不能简单的把数组a的首地址赋给value,需要将数组a的内容复制到value指向的内存空间中,另外成员max_length,初值最小必须是value指向的内存空间长度,即value指向的字符串长度+l(题意中max_length表示字符个数的最大值,所以需要包含字符串结束符’\0’)(此构造函数的形参必须传人的是字符串,如果是字符数组,必须传入数组的长度,以防数组a的最后一个字符不是结束符’\0’,此时strlen( )函数获取的长度,就不是字符数组a的字符个数)
③slringVar(const slringVar&strobj);
复制构造函数需要将形参strobj的成员赋给当前调用该复制构造函数的对象成员,在赋值value时,同样需要为value分配足够的内存空间。
④input_line(istrearn&ins);
input_line( )函数需要使用形参ins输入流,输入一个字符串存放到value中,题意要求可以输入空格,所以我们不能直接用输人流ins和输入运算符,因为输入运算符会丢弃空白符、空格符和制表符,可以使用输入流ins的成员函数:get( )和while循环,逐个输入字符存放到value下标i的字符中,直到输入的字符为换行符或value存满(i=max_length)为止,当这两个条件满足其一,那么就应该停止输入,另外需要注意:value指向的字符串结尾,必须包含空字符’\0’,所以下标。max_length-1必须是空字符,循环输入时,i取值最大为max_length-2。
⑤ostream&operator<<(oStream&outs,const stringVar the_string);
输出运算符重载函数,题意要求将the-string通过输出流outs输出,由于the_string是StringVar对象,所以输出的应该是对象的成员value指向的字符串,根据返回值可知,函数必须返回输入流ostream的引用;另外由于第一形参是输入流outs,所以无法通过stringVar对象来调用,该函数不是类的成员函数,函数定义时,不能限定stringVar作用域,由于该函数不是类的成员函数,所以使用输出流outs输出value指向的字符串时,不能直接使用私有成员value,而是应该使用getValue( )公有成员函数,返回value的值,再输出。
转载请注明原文地址:https://jikaoti.com/ti/57h0FFFM
本试题收录于:
二级C题库NCRE全国计算机二级分类
0
二级C
NCRE全国计算机二级
相关试题推荐
下列叙述中正确的是()。
有三个关系R,S和T如下:其中关系T由关系R和S通过某种操作得到,该操作为()。
使用VC6打开考生文件夹下的源程序文件modil.cpp,该程序运行时有错误,请改正错误,使得程序通过运行。程序输出:5a}注意:不要改动main函数,不能增行或删行,也不能更改程序的结构,错误的语句在∥
使用VC6打开考生文件夹下的源程序文件modi2.cpp。阅读下列函数说明和代码,补充空出的代码。函数convert(cha*des,char*str)实现的功能是:(1)如果字符串最后面有空格,则全部删除:(2)转换后的数据放到de
下列字符串中不能作为C++标识符使用的是()。
有如下类定义:classPoint{private:staticinthow_many;};________how_many=0;要初始化Point类的静态成员how_many,下画线处应填入的内容是()。
用树形结构表示实体之间联系的模型是()。
如果不使用多态机制,那么通过基类的指针虽然可以指向派生类对象,但是只能访问从基类继承的成员。有如下程序,没有使用多态机制。#include<iostream>usingnamespacestd;classBase{
在数据表视图中,不可以()。
C++系统预定义了4个用于标准数据流的对象,下列选项中不属于此类对象的是()。
随机试题
A、 B、 C、 B题干问的是想兑换现金还是直接积分。A、C选项虽然都出现了creditcard一词,但是回答均与问题无关。B选项是题干中所提到的一项,符合题意,故选B。
简述决策的影响因素。
关于正常心房除极波形态的描述,不正确的是
某实施监理的工程项目,在承重结构混凝土施工前,负责见证取样的监理工—程师通知总监理工程师在施工现场进行了混凝土试块的见证取样,由承包单位项目经理对送检样品进行加封后,由监理工程师送往试验室。试验室经试验后,出具了一式两份的试验报告,分别交由承包单位和建设单
根据期权定价理论中的B—S模型,欧式看涨期权的价值主要取决于()。
教师犹如露珠,滋润着吐艳的花朵;犹如泥土,无私地奉献养分。这形象地说明了为人师表所具有的()。
完善社会主义市场经济体制,迫切要求政府从“越位”的地方“退位”,在“缺位”的地方“补位”,把不该管的事交给市场,把该管的事不折不扣地管好。这说明()。
①按照玄武修仙的故事谒神朝圣,在红墙绿瓦、依山就势的道观和绿树雪景之中,飘然若身在仙境②问道武当山,不得不去金顶朝拜,路上又不得不经“治世玄岳”牌坊③玄岳门是典型的道教门洞式建筑,碧色石料与周边环境相得益彰,古朴而飘逸④这座牌坊又称玄岳门,位于冲虚庵
(2018年陕西)“这是一个光荣的名字,不朽的名字”,这是中共中央总书记习近平同志对老一辈革命家()的高度称赞。
Arecentstudy,whichwaspublishedinlastweek’sJournaloftheAmericanMedicalAssociation,offersapictureofhowriskyit
最新回复
(
0
)