C++ 多个构造函数 有一个地方不明白

Justflyaway 2010-08-11 11:55:33
本人小白昂,自己看书学的C++刚一个星期,有个地方实在搞不过去了……希望大家给看看昂。。。。

#include<iostream>
using namespace std;


class test
{
float *v;
int flag;
public:
test()
{
v=new float[3];
flag=3;

cout<<"Part one:\n"
<<"v is:"<<v<<endl
<<"flag is:"<<flag<<endl;
}


test(float *a)
{

cout<<"Part two:\n"
<<"v is:"<<v<<endl
<<"flag is:"<<flag<<endl;
cout<<"好好的数咋就变了???";

v=new float;//不重新new的话就溢出了

for (int i=0;i<3;i++)
{
v[i]=a[i];
}

}


};

int main(void)
{
float x[3]={1.1,2.2,3.3};

test v1;\\初始化
v1=x;\\类型转换

system("pause");
return 0;
}








第一个构造函数里初始化的值一下子全没了,为啥?????


...全文
413 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
幽魂 2010-08-21
  • 打赏
  • 举报
回复
csdn果然有很多无私的高手!!赞一个
lovestefanie 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 aizibion 的回复:]
楼主,默认的赋值成员函数是浅拷贝,如果类中包含有指针成员,这个指针成员指向的数据将被丢失


正确做法是自己重写赋值成员函数或拷贝构造函数进行所谓的“深拷贝”。

以下参考


C/C++ code


#include<iostream>
using namespace std;


class test
{
float *v;
int fla……
[/Quote]
+1
sese53 2010-08-12
  • 打赏
  • 举报
回复
cout<<"好好的数咋就变了???"

你太幽默了。你第一个对象又被v1=x;这个语句重新赋值了。这个是单参数构造函数的隐式转换,这个最好不要用,添加赋值构造函数接受float*的参数,另外最好构造函数explict
magic335096305 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 soullessm 的回复:]
新手,每天上论坛看老鸟解答问题提高自己
[/Quote]同感
aizibion 2010-08-11
  • 打赏
  • 举报
回复
楼主,默认的赋值成员函数是浅拷贝,如果类中包含有指针成员,这个指针成员指向的数据将被丢失


正确做法是自己重写赋值成员函数或拷贝构造函数进行所谓的“深拷贝”。

以下参考



#include<iostream>
using namespace std;


class test
{
float *v;
int flag;
public:
test()
{//初始化别忘了
this->v=new float[3];
memset(this->v,0,sizeof(float)*3);
this->flag=3;
}

~test()
{//别泄露了。。。
delete [] v;
}

test(float *a)
{//凡是构造,需要给v以空间
this->v=new float[3];
for (int i=0;i<3;i++)
{
v[i]=a[i];
}
this->flag=3;
}

//实现拷贝构造
test(test& _obj)
{
this->v=new float[3];
this->flag = _obj.flag;
for (int i=0;i<3;i++)
{
this->v[i]=_obj.v[i];
}
}

//实现赋值函数
test& operator=(test& _obj)
{
this->flag = _obj.flag;
for (int i=0;i<3;i++)
{
this->v[i]=_obj.v[i];
}

return *this;
}

//重载=操作符号
test& operator=(float* _obj)
{
for (int i=0;i<3;i++)
{
this->v[i]=_obj[i];
}

return *this;
}

int show()
{
cout<<"This flag = "<<this->flag<<endl;

for (int i=0;i<3;i++)
{
cout<<"This v["<<i<<"] = "<<this->v[i]<<endl;
}

return 0;
}
};

int main(void)
{
float x[3]={1.1,2.2,3.3};

//使用带参数构造函数
test v1(x);
v1.show();

//使用拷贝构造函数
test v2(v1);
v2.show();

//使用赋值函数
test v3 = v2;
v3.show();

//使用默认构造函数与重载=操作符号函数
test v4 = x;
v4.show();

system("pause");
return 0;
}
zotin 2010-08-11
  • 打赏
  • 举报
回复
“这个很因为v1被赋值了。”这句话写错了 —— 无视吧。
zotin 2010-08-11
  • 打赏
  • 举报
回复
这个很因为v1被赋值了。
test v1;
v1=x;
时,进行了隐式类型转换。把转换写出来就是:
test v1;
v1 = test(x);
类型转换是发生在赋值以前的。所以你看到的part2的内存是test(x)执行时输出,当然和v1的值无关。


jackyjkchen 2010-08-11
  • 打赏
  • 举报
回复
个人感觉还是=的问题,这样就行了


#include<iostream>
using namespace std;


class test
{
float *v;
int flag;
public:
test()
{
v=new float[3];
flag=3;

cout<<"Part one:\n"
<<"v is:"<<v<<endl
<<"flag is:"<<flag<<endl;
}


//test(float *a)
//{

// cout<<"Part two:\n"
// <<"v is:"<<v<<endl
// <<"flag is:"<<flag<<endl;
// cout<<"好好的数咋就变了???";

// v=new float;//不重新new的话就溢出了

// for (int i=0;i<3;i++)
// {
// v[i]=a[i];
// }

//}

test &operator=(float* a)
{
cout<<"Part two:\n"
<<"v is:"<<v<<endl
<<"flag is:"<<flag<<endl;
cout<<"好好的数咋就变了???";

//v=new float;//不重新new的话就溢出了

for (int i=0;i<3;i++)
{
v[i]=a[i];
}
return *this;
}
};

int main(void)
{
float x[3]={1.1,2.2,3.3};

test v1;//初始化
v1=x;//类型转换

system("pause");
return 0;
}

Justflyaway 2010-08-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jackyjkchen 的回复:]
你比不是应该重载一下 = 等号
[/Quote]

不用重载,test(float *a) 构造函数可以用来类型转换

编译能通过,那块也没错误,就是不明白 v和flag为什么会变
jackyjkchen 2010-08-11
  • 打赏
  • 举报
回复
你比不是应该重载一下 = 等号
yuandou123456 2010-08-11
  • 打赏
  • 举报
回复
去百度 一下下 就出来了
SoullessL 2010-08-11
  • 打赏
  • 举报
回复
新手,每天上论坛看老鸟解答问题提高自己
Justflyaway 2010-08-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zotin 的回复:]
这个很因为v1被赋值了。
test v1;
v1=x;
时,进行了隐式类型转换。把转换写出来就是:
test v1;
v1 = test(x);
类型转换是发生在赋值以前的。所以你看到的part2的内存是test(x)执行时输出,当然和v1的值无关。
[/Quote]
[Quote=引用 7 楼 aizibion 的回复:]
楼主,默认的赋值成员函数是浅拷贝,如果类中包含有指针成员,这个指针成员指向的数据将被丢失


正确做法是自己重写赋值成员函数或拷贝构造函数进行所谓的“深拷贝”。

以下参考


C/C++ code


#include<iostream>
using namespace std;


class test
{
float *v;
int fla……
[/Quote]

谢谢啦 又学了不少东西 我理解的层面太浅啦 还有好多好多东西要学!

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧