每日总结
每日总结
今天跟着视频学习了拷贝函数的基本用法,同时对视频中的案例都进行了代码实现,有一些需要理解的知识点如下。
学习了拷贝函数的基本构造语法:
Person(const Person &p){}
学习了拷贝函数的调用方法,调用时机:
- 使用一个创建完毕的对象来调用拷贝一个新的对象,默认属性全部复制:
1
2Person p1(10) ;
Person p2(p1) ; - 通过值传递给参数赋值
1
2
3
4
5void doWork(Person p){}
void test01{
Person p;
doWork(p);
} - 通过调用函数,利用值的方式返回局部对象
1
2
3
4
5
6
7
8Person doWork(){
Person p1;
return p1;
}
void test02(){
Person p = doWork();
}
学习了调用规则:
- 如果类中没有写任何对象初始化和清理的函数,那么编译器会默认调用默认构造函数(无参,函数体为空),默认析构函数(无参,函数体为空),默认拷贝构造函数(对属性值进行拷贝);
- 如果类中定义了含参数的构造函数,编译器会提供默认拷贝函数和析构函数,不会再提供没有参数的构造函数;
- 如果类中定义了拷贝构造函数,那么编译器不会再提供其他构造函数。
学会了深拷贝和浅拷贝的概念
一般编译器会默认拷贝构造函数为浅拷贝,即复制所有的属性,这样的情况下如果传入的是一个指针,那么拷贝出来的属性就会指向同一个地址,如果删除了前一个指针指向的堆空间,那么拷贝出来的指针就会指向空,引起出错,这就是典型的堆区重复使用
- 浅拷贝:简单的赋值拷贝
- 深拷贝:申请堆空间进行拷贝
- 总结:如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题
1 | #include<iostream> |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 M-blog!