#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了呀
uj5u.com熱心網友回復:
你呼叫有參建構式時,m_height指向的是一個堆疊物件。它在有參建構式結束后已經沒了uj5u.com熱心網友回復:
那個你獲取的是地址,而那個引數隨著函式的結束而結束,建構式運行完畢后,就沒了自然是亂數了uj5u.com熱心網友回復:
Person(int a,int height){
age = a;
m_height = &height;
cout << "Person的有參建構式的呼叫" << endl;
}
這個函式,int height是個臨時物件,height的生命周期在這個函式結束的時候結束,堆疊空間被回收,此處m_height = &height;在這個函式呼叫結束之后,m_height將成為一個野指標。
uj5u.com熱心網友回復:
有參建構式中:這一句
m_height = &height;
改為:
m_height = height;
test函式中
這一句:
cout << p2.age<<" "<< *p2.m_height << endl;
改為
cout << p2.age<<" "<< p2.m_height << endl;
就好了
uj5u.com熱心網友回復:
Person(int a,int height){
age = a;
m_height = &height; //這個height是區域變數,m_height指向區域變數的地址,離開了函式,區域變數就消失了,m_height就成了野指標。這是指標常見的錯誤用法,說明LZ對一般指標的用法還是不夠理解
cout << "Person的有參建構式的呼叫" << endl;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/200433.html
標籤:C++ 語言
上一篇:有大佬能解釋一下嗎
