C++学习(4)(拷贝构造函数 / 复制构造函数)

本文探讨了C++中的复制构造函数,它在何时被调用,如对象初始化、作为函数参数和返回值时。指出默认复制构造函数可能在处理指针成员时存在问题,可能导致指针悬挂。因此,当对象中包含指针时,应自定义复制构造函数以避免此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、形式:Person(const Person &p);
二、时机:

  1. 用已存在的对象去初始化新的对象时
  2. 对象做函数形式参数时
  3. 对象做函数返回值时

三、默认的复制构造函数只是将传进来的对象的每个变量的值赋值给新的对象,有时会出现问题,比如:
成员变量中有一个指针类型时,默认的复制构造函数是把新指针指向原来的同一个地址中去了,此时如果析构旧的对象,那新的对象的指针就指针悬挂了,此时必须给出自己的复制构造函数定义,给指针开辟空间

#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
class Person
{
private:
    char *name;
    int age;
public:
    Person(char *Name,int a);
    Person(const Person &p);//不用的话,会造成指针悬挂
    ~Person();
    void setAge(int a){age = a;}
    void show();
};
Person::Person(char *Name,int a)
{
    name = new char[strlen(Name)+1];
    strcpy(name,Name);
    age = a;
    cout<<"A person whose name is "<<name<<" and age is "<<age<<" is created."<<endl;
}
void Person::show()
{
    cout<<name<<" the address is:";
    printf("%d\n",name);
}
Person::~Person()
{
    cout<<"A person whose name is "<<name<<" and age is "<<age<<" is erased"<<endl;
    delete []name;
}
Person::Person(const Person&p)
{
    name = new char[strlen(p.name)+1];
    name = p.name;
    age=p.age;
    cout<<name<<" is copied."<<endl;
}
Person display(Person p)
{
    return p;
}
int main()    
{
    Person p1("张三",20);
    Person p2 = p1;//调用拷贝制造函数
//※拷贝函数调用时机:用已存在的对象初始化新对象
    //Person p2("zs",10);//不会调用拷贝制造函数
    //p2=p1;
    p1.setAge(100);
    p2.setAge(15);
    p1.show();
    p2.show();
    display(p1);
    //会被拷贝两次,
//※拷贝函数调用时机:对象做形式参数(可以改成传引用,这样不触发拷贝构造,节省空间);对象做函数返回值
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值