#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string>
using namespace std;
//常量指针:const char* pc1 =>指针的值不可以修改,但指针可以修改
//指针常量:char* const pc1 =>指针地值可以修改,但指针不能修改
class Person
{
public:
//构造函数意义:可以对类中的成员变量进行初始化
Person(const char* m_name, int m_age)
{
name = (char*)malloc(strlen(m_name) + 1);
//char * strcpy ( char * destination, const char * source
if (name == NULL)
{
cout << "malloc fail" << endl;
exit(-1);
}
strcpy(name, m_name);
age = m_age;
}
char* name;
int age;
//如果有属性开辟到堆区,利用编译器的默认拷贝构造函数函数会导致浅拷贝
//利用类的默认拷贝构造函数会会将靠背后的类的成员变量分配到同一块内存空间
//拷贝函数:给拷贝后生成类分配新的内存空间
//这样下面的析构函数就不会造成重复释放内存空间
Person(const Person& p)
{
name = p.name;
age = p.age;
}
//析构函数的作用:对存在堆区没释放的内存空间进行释放,将指针指向空
~Person()
{
cout << "进入析构函数" << endl;
if (name == NULL)
{
free(name);
name = NULL;
}
}
protected:
private:
};
void test01()
{
Person p1("qingyu", 18);
cout << "名字是:" << p1.name << " 年龄是:" << p1.age << endl;
Person p2 = Person(p1);
cout << "名字是:" << p1.name << " 年龄是:" << p1.age << endl;
}
class Student
{
public:
Student(string m_name, int m_age) //注意这里不要使用引用类型
{
name = string(m_name);
age = m_age;
}
//析构函数:
~Student()
{}
string name;
int age;
private:
};
void test02()
{
Student s1("xiaoliu", 19);
cout << "名字是:" << s1.name << " 年龄是:" << s1.age << endl;
}
int main()
{
test01();
test02();
return 0;
}
C++深浅拷贝的问题及解决
最新推荐文章于 2022-07-18 11:55:52 发布