#include <iostream>
#include <string>
using namespace std;
class person
{
public:
person()
{
cout << "默认构造函数的调用" << endl;
}
person(int age)
{
m_age = age;
cout << "有参构造函数的调用" << endl;
}
~person()
{
cout << "析构函数的调用" << endl;
}
public:
int m_age;
};
int main()
{
person p(10);
cout << "对象p的地址是:"<<(int*)&p << endl;
cout << "p对象的属性p.m_age的地址是:" << (int*)&p.m_age << endl;
person p1(p);
cout << "对象p1的地址是:" << (int*)&p1 << endl;
cout << "p1对象的属性p1.m_age的地址是:" << (int*)&p1.m_age << endl;
cout << "p.m_age的值为10时,p1.m_age的值为:" << p1.m_age << endl;
p.m_age = 20;
cout << "若p.m_age改为20,则p1.m_age变成:"<<p1.m_age << endl;
system("pause");
return 0;
}
输出结果如图: 在实例化对象时,类对象的地址和对象成员变量的地址是一样的。经过拷贝构造函数,p对象拷贝一个新的临时对象p’赋值给p1,所以p和p1的地址不同,当p的成员变量改变时,p1的成员变量并没有改变。 但当对象的成员变量是指针时,经过系统调用默认拷贝构造函数,p1的成员变量指针和p的成员变量指针存储的地址是一样的,如下:
#include <iostream>
#include <string>
#include <ctime>
#include<cmath>
using namespace std;
class person
{
public:
person()
{
cout << "默认构造函数的调用" << endl;
}
person(int age,int score)
{
m_age = age;
m_score = new int(score);
cout << "有参构造函数的调用" << endl;
}
~person()
{
cout << "析构函数的调用" << endl;
}
public:
int m_age;
int* m_score;
};
int main()
{
person p(10,100);
cout << "p的成员变量指针m_score的地址是:" <<p.m_score << endl;
cout << "p的成员变量m_age的地址是:" << &p.m_age << endl;
cout << "p地址是:" << &p << endl;
person p1(p);
cout << "p1的成员变量指针m_score的地址是:" << p1.m_score << endl;
cout << "p1的成员变量m_age的地址是:" << &p1.m_age << endl;
cout << "p1的地址是:" << &p1 << endl;
system("pause");
return 0;
}
程序结束后,两个对象的指针内存相继被释放,因为地址是一样的,所以同一地址会被释放两次,系统会报错,这就是浅拷贝带来的内存重复释放问题。值得注意的是,对象p、p的成员变量m_age的地址是一样的。同理,对象p1、p1的成员变量m_age的地址也是一样的。
|