c++有参构造函数和拷贝构造函数

AC_YE 2020-11-01 11:32:25
#include<iostream> using namespace std; class Person { public: Person() { cout << "Person的无参构造函数的调用" << endl; } Person(int a,int height) { age = a; m_height = &height; cout << "Person的有参构造函数的调用" << endl; } Person(const Person &p) { age = p.age; m_height = p.m_height; cout << "Person的拷贝构造函数的调用" << endl; } ~Person() { cout << "Person的析构函数调用" << endl; } int age; int *m_height; }; void test() { Person p1(18,172); Person p2(p1); cout << p2.age<<" "<< *p2.m_height << endl; } int main() { test(); system("pause"); return 0; } 为什么*p2.m_height输出是乱码,我里面是把height的地址给了指针m_height了呀
...全文
250 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Master Cui 2020-11-04
  • 打赏
  • 举报
回复
Person(int a,int height) { age = a; m_height = &height; cout << "Person的有参构造函数的调用" << endl; } 函数执行结束后,函数的形参被释放,此时形参的内存无效,成员变量因此指向一块无效的内存,所以打印出来是无效的值
maguangzhi 2020-11-04
  • 打赏
  • 举报
回复
*p2.m_height为难码的原因在m_height = &height;取得参数的地址,而参数是在栈上分配内存的,栈又是由多个程序(多任务环境如windows)共享的,当你的程序运行时,同一地址的栈内容被函数调用反复冲刷,所以就不知道是什么内容了,请看教材《C++程序设计精要教程》对次问题的分析以及相关习题。
  • 打赏
  • 举报
回复
有参构造函数中:
这一句
m_height = &height;
改为:
m_height = height;

test函数中
这一句:
cout << p2.age<<" "<< *p2.m_height << endl;
改为
cout << p2.age<<" "<< p2.m_height << endl;

就好了
SleekStone 2020-11-02
  • 打赏
  • 举报
回复
Person(int a,int height) { age = a; m_height = &height; cout << "Person的有参构造函数的调用" << endl; } 这个函数,int height是个临时对象,height的生命周期在这个函数结束的时候结束,栈空间被回收,此处m_height = &height;在这个函数调用结束之后,m_height将成为一个野指针。
真相重于对错 2020-11-02
  • 打赏
  • 举报
回复
那个你获取的是地址,而那个参数随着函数的结束而结束,构造函数运行完毕后,就没了自然是随机数了
qq_40162781 2020-11-02
  • 打赏
  • 举报
回复
你调用有参构造函数时,m_height指向的是一个栈对象。它在有参构造函数结束后已经没了
qybao 2020-11-02
  • 打赏
  • 举报
回复
Person(int a,int height)
{
age = a;
m_height = &height; //这个height是局部变量,m_height指向局部变量的地址,离开了函数,局部变量就消失了,m_height就成了野指针。这是指针常见的错误用法,说明LZ对一般指针的用法还是不够理解
cout << "Person的有参构造函数的调用" << endl;
}

64,282

社区成员

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

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