构造函数调用问题,非常奇怪

wangzhangyong411 2007-05-11 01:55:51
#include <stdio.h>

class test
{
public:
test();
test(const char *buffer);
void printit();

private:
char m_buffer[10];
char *p;
};

test::test()
{
p = m_buffer;
printf("%p, %p\n", p, m_buffer);
}

test::test(const char *buffer)
{
test();
printf("%p, %p\n", p, m_buffer);
}

int main()
{
test a("adf");

return 0;
}

为什么俩次printf出来的结果不一样?

求解 并改正,要求要一个构造函数调用另一个构造函数

...全文
1099 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
qwerasd1234 2007-05-16
  • 打赏
  • 举报
回复
#include <stdio.h>

class test
{
public:
test();
test( char *buffer);
void printit();

private:
char m_buffer[10];
char *p;
};

test::test()
{
p = m_buffer;
printf("%p, %p\n", p, m_buffer);
}

test::test(char *buffer)
{
test();
p = m_buffer;
printf("%p, %p\n", p, m_buffer);
}

int main()
{
test a("adf");

return 0;
}
hongwei1230 2007-05-16
  • 打赏
  • 举报
回复
昏啦 我不知道上面即用C还用了JAVA吗 我只学一门啦 脑海一遍是C还是JAVA呢
powerqt 2007-05-15
  • 打赏
  • 举报
回复
#include<iostream>
#include<string>
class Test
{
char*msg;
public:
Test()
{
msg=0;
std::cout<<(msg?msg:"Pointer is NULL!")<<std::endl;//防止使用空指针
}
Test(char*msg)
{
Test();//.......这里不是调用构造函数,而是...创建一个临时对象,或称为无名对象,忘记了,不知道是在哪本C++专著里看的
this->msg=msg;
std::cout<<this->msg<<std::endl;
}
~Test()
{
std::cout<<"Object destroy\n";//...检测创建了多少个对象
}
};
int main()
{
Test test("abcdefg");
std::cout<<"....................."<<std::endl;
return 0;
}
//////////////////////////////////////////////////////////
经过我的测试运行,第一个Object destroy不但在....................之前输出,而且在abcdefg之前输出,证明在第二个构造函数中的Test();这一行创建的是一个临时对象...:此对象在创建之时立即销毁。
cmail 2007-05-12
  • 打赏
  • 举报
回复
加入析构函数也许你会看得更明白.
class test
{
public:
test();
test(const char *buffer);
void printit();
~test(){printf("destructor called!");}

private:
char m_buffer[10];
char *p;
};


如果想达到你那个效果,可以这样写,你那种解决方法并不是通用的.
test::test(const char *buffer)
{
new (this) test(); //placement new
printf("%p, %p\n", p, m_buffer);
}
gooderfeng 2007-05-12
  • 打赏
  • 举报
回复
你这样不就已经掉了两个构造函数了吗?还想怎么样,这样做的人有很多,也很有意义。
cdsnpeter 2007-05-12
  • 打赏
  • 举报
回复
不一样是一定的啦。一样了才怪呢。

test::test(const char *buffer)
{
test(); //这里构造了另一个对象,并执行了test()中的Printf,然后会打印一个很乱的值。
printf("%p, %p\n", p, m_buffer);//这里应该不能编译通过吧?
}
axx1611 2007-05-12
  • 打赏
  • 举报
回复
显然最合理的办法就是专门写一个函数让两个构造函数去调用。
如果在某些情况下你没办法这么做就用覆盖new
new (this) Test();
hbdn520 2007-05-12
  • 打赏
  • 举报
回复
mark
marrco2005 2007-05-12
  • 打赏
  • 举报
回复
mark
L_jila 2007-05-12
  • 打赏
  • 举报
回复
什么意思?构造函数可以再调用另一个构造函数吗??构造函数的作用不就是初始化一个对象吗??
wangzhangyong411 2007-05-11
  • 打赏
  • 举报
回复
我已经弄出来了

在原来的构造函数里再去调用默认构造函数只要这么写就可以了

this->test::test();

其他的好像都不可以写,要么就像楼上的诸位说的调用其他非构造函数来实现

SpanOver 2007-05-11
  • 打赏
  • 举报
回复
你没有明白在C++中构造函数的作用啊
dai_weitao 2007-05-11
  • 打赏
  • 举报
回复
上面都说明白了, 俩对象.
构造函数不是随便调的.
你想调函数自己写个,而不是调构造.
isarc 2007-05-11
  • 打赏
  • 举报
回复
test::test1()
{
p = m_buffer;
printf("%p, %p\n", p, m_buffer);
}

我就不明白了,没有赋予初值,怎么可以就等?还要输出?有参数的构造函数,参数也没有用啊?
高手指点。
自由建客 2007-05-11
  • 打赏
  • 举报
回复
test::test1()
{
p = m_buffer;
printf("%p, %p\n", p, m_buffer);
}

test::test()
{
test1();
}

test::test(const char *buffer)
{
test1();
printf("%p, %p\n", p, m_buffer);
}
庄鱼 2007-05-11
  • 打赏
  • 举报
回复
class test{
char m_buffer[10];
char *p;
public:
test(char*s=0){
p = s?s:m_buffer;
printf("%p, %p\n", p, m_buffer);}
...
};
opengl3d 2007-05-11
  • 打赏
  • 举报
回复
构造函数就是用来创建实例的,哈哈
frogJump 2007-05-11
  • 打赏
  • 举报
回复
C++里不能显式调用构造函数!!!
Jack_xiao 2007-05-11
  • 打赏
  • 举报
回复
不明白lz要干什么
构造函数没有完成其功能,m_buffer也没赋值
输出地址是想看m_buffer与p是否指向同一地址吗?
  • 打赏
  • 举报
回复
this->test();不知道能不能成功
加载更多回复(5)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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