写出下面程序的运行结果,请用增加拷贝构造函数的方法避免存在的问题。

作者&投稿:法湛 (若有异议请与网页底部的电邮联系)
请用增加拷贝构造函数的办法避免下列程序存在的问题~

#include
using namespace std;

class Vector{
int size;
int* buffer;
public:
Vector(int s=100);
Vector(Vector & v);
int& elem(int ndx);
void display();
void set();
~Vector();
};

Vector::Vector(int s){
buffer=new int[size=s];
for(int i=0;i<size; i++)
buffer[i]=i*i;
}

Vector::Vector(Vector & v)
{
size=v.size;
buffer=new int[size];
for(int i=0;i<size;i++)
buffer[i]=v.buffer[i];
}

int& Vector::elem(int ndx){
if(ndx=size){
cout<<"eror in index"<<endl;
exit(1);
}
return buffer[ndx];
}

void Vector::display(){
for(int j=0; j<size; j++)
cout<<buffer[j]<<endl;
}

void Vector::set(){
for(int j=0; j<size; j++)
buffer[j]=j+1;
}
Vector::~Vector(){ delete[]buffer;}

int main(){
Vector a(10);
Vector b(a);
a.set();
b.display();
return 0;
}

拷贝构造函数,又称复制构造函数,由编译器调用来完成一些基于同一类的其他对象的构建及初始化。在一个对象以值传递的方式传入函数体时;一个对象以值传递的方式从函数返回时;一个对象用于给另外一个对象进行初始化(常称为赋值初始化)时被自动调用。
拷贝构造函数必须以引用的形式传递(参数为引用值)。当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。
如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回的时候也同样的被调用。

扩展资料:
使用原则:
通常的原则是:对于凡是包含动态分配成员或包含指针成员的类都应该提供拷贝构造函数;在提供拷贝构造函数的同时,还应该考虑重载"="赋值操作符号。
拷贝构造函数的格式为:
类名(const 类名& 对象名); 拷贝构造函数的原型,参数是常量对象的引用。由于拷贝构造函数的目的是成员复制,不应修改原对象,所以建议使用const关键字。
参考资料来源:百度百科-拷贝构造函数

没有复制构造函数时输出1--9,现在使用复制构造函数修正成员带有指针问题的方法如下:
class Vector
{
public:
Vector(int s=100);
int& Elem(int ndx);
void Display();
void Set();
~Vector();
Vector(const Vector &obj); //添加复制构造函数
protected:
int size;
int* buffer;
};

Vector::Vector(int s){ buffer=new int[size=s];for(int i=0; i<size; i++)buffer[i]=i*i;}

int& Vector::Elem(int ndx)
{if(ndx<0||ndx>=size){cout <<"error in index" <<endl;exit(1); }
return buffer[ndx];}

void Vector::Display(){ for(int j=0; j<size; j++)cout <<buffer[j] <<endl;}

void Vector::Set(){ for(int j=0; j<size; j++)buffer[j]=j+1;}

Vector::~Vector(){ delete[]buffer; }

Vector::Vector(const Vector &obj) //复制构造函数的实现
{
this->size=obj.size; //复制成员变量size的值。
int *p=new int[size]; //创建一个临时指针
for(int i=0;i<this->size;i++)
{p[i]=obj.buffer[i]; //将传递进来的参数中的指针的值逐个赋给临时指针
}
buffer=p; //把临时指针指向的地址传给自已的成员指针。
}

void main()
{ Vector a(10);
Vector b(a);
a.Set();
b.Display();

system("pause");
}

现在正常了,结果输出0--9的平方数,也就是0,1,4,9,16....81

#include<iostream>
using namespace std;

class Vector{
int size;
int* buffer;
public:
Vector(int s=100);
Vector(Vector & a);
int& Elem(int ndx);
void display();
void set();
~Vector();
};

Vector::Vector(int s)
{
buffer=new int[size=s];
for(int i=0;i<size; i++)
buffer[i]=i*i;
}

Vector::Vector(Vector & a)
{
size=a.size;
buffer=new int[size];
for(int i=0;i<size;i++)
buffer[i]=a.buffer[i];
}

int& Vector::elem(int ndx){
if(ndx<0||ndx>=size){
cout<<"eror in index"<<endl;
exit(1);
}
return buffer[ndx];
}

void Vector::display(){
for(int j=0; j<size; j++)
cout<<buffer[j]<<endl;
}

void Vector::set(){
for(int j=0; j<size; j++)
buffer[j]=j+1;
}
Vector::~Vector(){ delete[]buffer;}

int main(){
Vector a(10);
Vector b(a);
a.set();
b.display();
return 0;
}


C语言~~写出下面程序的运行结果
f的定义呢?是{ n=8\/n;m=m\/2;}么?printf最后那个\/n应该是\\n吧.结果是m=5,n=3.因为f定义内的n是形参,形参的变化不影响实参的值,虽然它们名字一样.而m是全局变量,在所有函数中都可以访问它.

下面程序的运行结果是?
___for(k=1;(c=s[k])!='\\0';k++)用K来做循环!'\\0'这样的表达其实是一种ASCII码的字符!!就好像是A='\\0'这样的!具体的你可以上网找下!___{ switch(c)这里是好像是当C=A这个意思啊!然后在进行跳转!___{ case 'A':putchar('%');continue;等于A就打印出%这个符号 ___case '...

给出下述源程序的运行结果?
\/\/运行结果如下 7 ok \/\/说明如下 include<iostream.h> void main(){ int a=5;do { a++;\/\/这条执行完a=6 cout<<++a<<endl;\/\/这条是a先+1=7,再输出7及换行 if(a==10)break;\/\/a=7不满足条件 }while(a==9)\/\/首先这里缺少; a=7不满足条件退出while循环 cout<<"ok\\n";\/\/...

下面程序的输出结果是
运行结果:51 60 21 程序 include<stdio.h> struct st \/\/原程序多了个分号 {int x;int *y;}*p;int dt[4]={10,20,30,40}; \/\/定义数组dt struct st aa[4]={50,&dt[0],60,&dt[1],70,&dt[2],80,&dt[3]};\/\/定义结果数组aa void main(){p=aa; \/\/结构指针p指向结构...

写出以下程序段的运行结果。请注意,直接填数字或者字符,前后不要加空...
判断条件和循环体中都用了getchar()接收字符 而putchar是紧跟在循环判断条件后的,所以金属出判断时getchar时的输入,也就是第1,3,5次的字符的输入结果,第七次输入的是#,不符合循环条件,直接退出循环了

以下程序运行后,输出结果是( ) main() { char *s="abcde"; s+=2...
选择答案C,输出的为字符c的地址。因为%d是打印整形变量的值,因为前一句执行了s+=2,s指针偏移了两个位置,偏移了两个位置之后s指向的是字符c,所以输出语句输出的是指针s,而s存放的是地址,所以输出的就是字符c所在的地址。

程序的运行结果
\/\/程序至少有3个错误,下面是正确的。include <stdio.h> void fun(int a,int b) \/\/这个函数交换的是传过来的值,不会影响实参的值。{int t;t=a;a=b;b=t;} void main(){int c[10]={1,2,3,4,5,6,7,8,9,0},i;for(i=0;i<10;i+=2) fun(c[i],c[i+1]);\/\/i=1...

下面程序运行的结果是()。 int n=0; while(n++<=2); cout<<n; A.2...
n++<=2 相当于 n<=2 和n++这样理解。要n<=2不成立,则n=3可以结束while循环 然后 n++则n变为4了 所以C n++是先使用n,然后再改变n的值。也就是说 先把n与2比较,然后再++

C语言简单题
第2题:结果应该是1,因为unsigned short类型的数值范围是0到65535,(- -!汗,你可找c\\c++程序设计的书,那里可以找到数据类型的数值范围)因为int是范围要大多,又因为signeed是以补码形式存放,而unsigned是全部2进制位都用本身表示自己,所以 程序的输出结果是-1;第3题:x\/y=0.5,但要自动...

程序题:1.阅读:指出下列程序的功能及运行结果.
楼上说的没错。程序有点错误,我改了一下。正确程序如下:10 DIM D(14){定义数组} 20 FOR K=0 TO 14 30 READ D(K)40 NEXT K{读入数组} 50 A=D(1):B=D(1){不能为D(0),因为你定义的是1..14!无0,且如果是0的话,A没什么,照样输出最大值,但B是最小值,这样会输出0的...

乌海市15384908076: 写出下面程序的运行结果,请用增加拷贝构造函数的方法避免存在的问题. -
脂柱君维: 问题出在 scanf 函数上,中间加上空格以后,程序默认空格为输入完成,所以后空格后面的省略掉了. 将scanf函数改为gets函数即可. #include <stdio.h>#define array 100 int str_copy(char *p1, char *p2) { int i=0; while(p1[i]!='\0') { p2[i]=p1[i]; i++; ...

乌海市15384908076: 写出下列程序的运行结果
脂柱君维: #includevoid main() { int x=3,y=3; switch(x%2) //x%2=1 运行case 1: { case 1: switch (y) //y = 3 运行default { case 0:cout评论000

乌海市15384908076: 写出下列程序的运行结果: - ----- -
脂柱君维: 根据题中的伪代码,模拟运行如下:输入S=0,i=0,∴i=0+1=1,S=0+1=1∴i=1+1=2,S=1+2=3∴i=2+1=3,S=3+3=6∴i=3+1=4,S=6+4=10=10,不符合结束的条件,继续运行,∴i=4+1=5,S=10+5=15>10,符合结束的条件,停止运行,输出i=5. 故答案为:5.

乌海市15384908076: C语言:写出下列程序运行结果 -
脂柱君维: s数组中的字符串字符个数有8个,还有最后一个空字符(双引号的字符常量后面自动跟着空字符).空字符的ASCII值为0.所以第一个for的循环次数为字符个数.即循环8次.分别对应12134211 第一次:case 1. i=0. v[0]++; //第一次循环完修改了第一个元素值.v={1,0,0,0} 同理12134211 对应修改v数组中的第K个元素,即修改第一个元素4次.第二个2次等等 所以 v={4,2,1,1}; 总的来说s数组中出现 1~4的各个数 控制v数组 对应1~4个元素的值 最后输出v数组中的所有元素.也就是4211

乌海市15384908076: 1、写出下面程序运行结果.
脂柱君维: 1 1 2 1 3 1 4 1 因为函数f()中的a是一个局部变量.定义的时候存放在栈中,随着函数调用结束就会释放栈,a就相当于消失了.下一次进入时a会从新定义,重新划分空间,这样a还是从0开始加加.如果你想a的值一直存在在int a=0;前面加static.

乌海市15384908076: 写出以下程序运行的结果. -
脂柱君维: 你好!!!aabb cc abc A N Press any key to continue 首先aabb 第一个a和第一个b都是输出成格式里面的,后面的a,b才是字符变量c1,c2输出的,cc 第一个c是输出格式里,第二个c是字符变量c3输出的 abc是“abc\n”,输出的 c4='\101',c5='\116'都是以八进制给出的,转化后就就是字符A 和N了.'\t\b'都是转义字符,lz可以查看自己的转义字符表看看作用.好运!!

乌海市15384908076: 写出下列程序执行的结果.
脂柱君维: printf("%4s","MNO");%4s就设定字符串输出时的格式和对齐方式,在不超过4个字符时能向右整齐对齐. 第一轮执行,j=4,执行 default: printf("%4s","MNO");第二轮执行,j=3, case 3: printf("%4s","JKL"); default: printf("%4s",...

乌海市15384908076: 写出下面程序运行的结果: -
脂柱君维: 1,-2 while y=2!=-1,执行--,此时y=1 进入do 完成do,x=2;与do连的while y==1,后y=0,进入do,x=1; 与do连的while y==0,跳出do,y=-1;进入第一个while y=-1==-1,跳出while,执行--,y=-2 进入printf,1,-2

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网