首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
请打开考生文件夹下的解决方案文件proj3,其中定义了一个字符串变量类stringVar。类成员的说明在程序注释中。请在//*********333*********和//*********666*********之间填写stringVar成员函数和友元函
请打开考生文件夹下的解决方案文件proj3,其中定义了一个字符串变量类stringVar。类成员的说明在程序注释中。请在//*********333*********和//*********666*********之间填写stringVar成员函数和友元函
admin
2019-03-24
74
问题
请打开考生文件夹下的解决方案文件proj3,其中定义了一个字符串变量类stringVar。类成员的说明在程序注释中。请在//*********333*********和//*********666*********之间填写stringVar成员函数和友元函数的实现代码。在main函数中给出了一组测试数据,运行时输入:
Hello Kitty
此情况下程序的输出应该是:
Hello Kitty
Borg
Borg
注意:只需在//*********333*********和//*********666*********之间填入所编写的若干语句,不要改动程序中的其他内容。
//stringVar.h
#include
#include
#include
#include
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;};//#7构函数
int length()const{return strlen(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
#include
#include"stringVar.h"
//*********333*********
//*********666*********
int main()
{
stringVar namel(30),name2("Borg");
namel.input_line(cin);
stringVar name3(name2);
cout<
cout<
cout<
writeToFile(".\\");
return 0;
}
//writeToFile.cpp
#include
#include
#include
#include
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 namel(40),name2("John");
namel.input_line(is);
stringVar name3(name2);
fout<
fout.close();
}
选项
答案
stringVar::stringVar(int size) :max_length(size)//使用成员初始化列表初始化max_length { value=new char[size]; value[0]=’\0’; } stringVar::stringVar(const char a[]) { max_length=strlen(a)+1; value=new char[max_ length]; strcpy(value,a); } stringVar::stringVar(const stringVar&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
解析
由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指向的字符串长度+1(题意中max_length表示字符个数的最大值,所以需要包含字符串结束符’\0’)(此构造函数的形参必须传入的是字符串,如果是字符数组,必须传入数组的长度,以防数组a的最后一个字符不是结束符’\0’,此时strlen()函数获取的长度,就不是字符数组a的字符个数)
③stringVar(const stringVar&strobj);
复制构造函数需要将形参strobj的成员赋给当前调用该复制构造函数的对象成员,在赋值value时,同样需要为value分配足够的内存空间。
④input_line(istream&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 string Var the_string);
输出运算符重载函数,题意要求将the_string通过输出流outs输出,由于the_string是stringVar对象,所以输出的应该是对象的成员value指向的字符串,根据返回值可知,函数必须返回输入流ostream的引用;另外由于第一形参是输入流outs。所以无法通过stringVar。对象来调用,该函数不是类的成员函数,函数定义时,不能限定stringVar作用域,由于该函数不是类的成员函数,所以使用输出流outs输出value指向的字符串时,不能直接使用私有成员value,而是应该使用getValue()公有成员函数,返回value的值,再输出。
转载请注明原文地址:https://kaotiyun.com/show/mlAp777K
本试题收录于:
二级C题库NCRE全国计算机二级分类
0
二级C
NCRE全国计算机二级
相关试题推荐
下列描述中错误的是()。
程序:#include"iostream.h"voidmain(){inti=10;intj=5;cout<<j+i++<<endl;}的结果为______。
下列函数的运行结果是#include<iostream.h>intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;
假定A为一个类,则语句A(A&a);为该类______函数的原型说明。
数据的逻辑结构有线性结构和______两大类。
以下叙述正确的是
已经intDBL(intn){returnn+n;}和longDBL(longn){returnn+n>是一个函数模板的两个实例,则该函数模板的定义是______。
有以下类定义:classA{char*a;public:A():a(0){}A(char*aA){//把aa所指字符串复制到a所指的存储空间a=______;strcpy(a
若表达式(x+(y-z)+(m/n))+3中的变量均为double型,则表达式值的类型为______。
在结构化方法中,软件开发阶段用数据流程图(DFD)作为描述工具的是()。
随机试题
与知识产权有关的不正当竞争行为包括()
女性,30岁,反复发作脓血便,伴膝关节疼痛,多次细菌培养阴性,X线钡剂检查示乙状结肠袋消失,管壁平滑变硬,肠管缩短,肠腔狭窄,下列哪种诊断可能性大
建立社区健康档案的目的中错误的是
牛膝的质地、断面为绵马贯众的质地、断面为
患者,男,67岁,症见喘促日久,呼多吸少,气不得续,动则喘甚,尿后余沥,形瘦神疲,医生辨证为喘证,证属()。
在图4-92所示机构中,已知OA=3m,O1B=4m,ω=10rad/s,图示瞬时O1A=2m,则该瞬时B点速度的大小vB=()m/s。
劳动争议申请仲裁的时效期间为()。
如果两个公司的财务比率数据完全相同,其中一个的应收账款账龄均为1年以内,另一个的应收账款账龄有50%以上超过2年,那么后者流动比率的可信度低于前者。()
下列选项属于警官职务序列的是()。
徐某,男,20岁。1997年12月2日下午,徐与同学王沁华等人在课间休息时相互扔雪球耍,事后王沁华发现裤子被木材划破,怀疑是徐所为。因此,王在上课时用雪球打徐,并向徐身上吐痰。放学后,王沁华、王金泉为此又追赶殴打徐。第二天下午外出时又遭王金泉、王沁华的殴打
最新回复
(
0
)