C++ 构造函数,拷贝构造

  1. 构造函数和析构函数
    1. 构造函数:对象创建时调用构造函数,构造函数是初始化对象的属性
    2. 析构函数:对象在销毁前调用析构函数,析构函数做清理工作
    3. 构造函数分类:无参构造,有参构造,拷贝构造
    4. 编译器给类提供了什么函数:默认构造函数(无参),默认拷贝构造,析构函数,默认的赋值函数
    5. 如果自己提供了构造函数,那么编译器不会提供默认的构造函数,但是会提供默认的拷贝构造函数
    6. 如果自己提供了拷贝构造函数,那么编译器不会提供任何默认构造函数
    7. 构造函数,没有返回值,没有void
    8. 析构函数不能重载,没有参数,没有返回值,没有void
  2. 匿名对象
    1. 没有名字的对象,他的生命周期在当前行
    2. 当前面有Copy copy; 后面不就能这样写Copy(copy)
  3. 调用拷贝构造函数的时机
    1. 一个对象去初始化另一个对象时
    2. 对象做函数参数时
    3. 看编译器:返回局部对象时,有的调用,有的不调用
  4. 多个对象的构造函数调用顺序
    1. 先调用成员对象,成员对象的调用顺序看定义前后,最后调用本身的构造函数
    2. 析构函数调用的顺序和构造函数相反
    3. 为什么要写初始化列表:当成员对象没有默认构造时,我们要调用其他构造函数是,需要显示的调用,这时要写初始化列表
  5. 深浅拷贝
    1. 如果类内有指针,并且该指针指向申请的堆空间,这时只使用默认的拷贝构造函数,那么会出现浅拷贝问题,(一块空间在析构函数中被释放两次)
    2. 深拷贝:自己写的拷贝构造函数,申请一块空间,把旧空间的数据拷贝到新空间

拷贝构造调用时机 

class Maker
{
public:
    Maker()
    {
        cout << "无参构造函数" << endl;
    }
    Maker(int a)
    {
        cout << "有参构造函数" << endl;
    }
    Maker(const Maker &maker)
    {
        cout << "拷贝构造函数" << endl;
    }
    ~Maker()
    {
        cout << "析构函数" << endl;
    }
};

// 1.对象以值方式给函数参数
void func(Maker m)//Maker m=m1;
{
​
}
​
void test01()
{
    Maker m1;
    func(m1);
​​​​​​​}


//2.用一个已有的对象去初始化另一个对象
void test02()
{
    Maker m1;
    Maker m2(m1);
}


//3.函数的局部对象以值的方式从函数返回,vs Debug(调试)模式下,会调用拷贝构造,vs Release(发行)模式下不会调用拷贝构造,qt也不调用
Maker func2()
{
    //局部对象
    Maker m;
    cout << "局部对象的地址:" << &m << endl;
​
    return m;
}
​
void test03()
{
    
    Maker m1 = func2();
​
    cout << "m1对象的地址:" << &m1 << endl;
}
​

 使用指针时的写法:

#include <iostream>
using namespace std;

class Copy {
public:
	Copy() {
		cout << "no params constructor" << endl;
	}
	Copy(int a) {
		cout << "have params constructor" << endl;
	}
	Copy(const Copy &co) {
		cout << "copy constructor" << endl;
	}
	Copy(const Copy *co) {
		cout << "copy constructor" << endl;
	}
	~Copy() {
		cout << "deconstructor" << endl;
	}
};
#include <iostream>
#include "./copy.cpp"
using namespace std;

void test() {
	cout << "------------------------------" << endl;
    Copy();
    Copy(1);
	Copy c1;
	Copy c2(1);
	Copy c3(c1);
	Copy c4 = c1;
	Copy c5 = 1;
	cout << "------------------------------" << endl;
	Copy *c6 = new Copy();
	Copy *c7=new Copy(1);
	Copy *c8 = new Copy(*c7);
	Copy *c9 = new Copy(c7);
}

int main() {
	test();
	system("pause");
	return EXIT_SUCCESS;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值