【C++入门】拷贝构造函数详解

1、构造函数和析构函数

参考博客:《【C++入门】(拷贝)构造函数和析构函数》

2、深拷贝和浅拷贝

参考博客:《【C++入门】深拷贝和浅拷贝详解》

3、拷贝函数介绍

(1)拷贝构造函数是特殊的构造函数,其传参的格式是固定的,传入的都是const修饰的类引用;
(2)拷贝构造函数是在用同类型的对象进行初始化时调用的;
(3)拷贝函数需要考虑深拷贝和浅拷贝的问题。
(4)如果类中没有指针变量,则可以使用默认的拷贝构造函数(浅拷贝);
(5)如果类中有指针变量,则必须手动编写拷贝构造函数去进行拷贝;

4、示例代码

#include <iostream>

using namespace std;

class Person{
public:
    int age;
    int gender;
    string *name;    //人的名字

    //构造函数
    Person();
    Person(string myname);
    Person(const Person &p);	//拷贝构造函数

     // 析构函数
    ~Person();

};

int main(void)
{
    //定义并初始化对象A
    Person A ("linux");
    A.age = 27;
    A.gender = 1;

	 //用A去初始化B
    Person B = A;

		//打印name的内存地址
    cout << "A.name=" << A.name  << endl <<"B.name=" << B.name << endl;

    cout << "*B.name=" << *B.name << endl;
    cout << "B.age=" << B.age << endl;
    cout << "B.gender=" << B.gender << endl;

    return 0;
}

//  默认构造函数
Person::Person()
{
    cout << "Person::Person()" << endl;
};

// 初始化name的构造函数
Person::Person(string myname)
{
    this->name = new string();
    *this->name=myname;
    cout << "Person::Person(string myname):name(myname)" << endl;
};

// 拷贝构造函数
Person::Person(const Person &p):age(p.age), gender(p.gender)
{
	 //对指针变量需要自己申请一块内存
    this->name = new string(*p.name);
    cout<< "copy constructor" << endl;
};

// 析构函数
Person::~Person()
{
    cout << "[~Person] delete this->name" << endl;
    delete (this->name);
};

5、代码执行结果分析

root@ubuntu:# ./app 
Person::Person(string myname):name(myname)
copy constructor
A.name=0x8442020
B.name=0x8442030
*B.name=linux
B.age=27
B.gender=1
[~Person] delete this->name
[~Person] delete this->name

(1)从执行顺序来看,拷贝构造函数是用A初始化B时被调用的;
(2)从A和B的name变量(内存地址)打印来看,两者地址不相同,说明拷贝构造函数的深拷贝是有效的;
(3)拷贝构造函数中,普通变量用浅拷贝,指针变量用深拷贝;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值