标签:指针 按引用传递 ref strlen 拷贝 bsp 动态 div 自己
1.复制构造函数原型
class_name(const class_name&)
两个值得思考的地方:
1.1.为什么这里参数是常量?其实这里不用常量也可以,只不过会存在一个问题。如果我们利用临时对象作为参数调用复制构造函数。
由于非常量的引用不能指向临时对象,所以不可以这样做。参考这篇博文:https://www.cnblogs.com/BensonLaur/p/5234555.html
1.2.为啥是按引用传递?按值传递可以吗?不可以按值传递,原因是按值传递是首先拷贝这个值,必然又会调用复制构造函数,函数就变成了死循环,
这tm不是递归调用嘛。
2.何时会调用
2.1.函数按值传递对象时,会复制对象,调用复制构造函数
2.2.函数返回对象时,会先把这个对象复制一份,调用复制构造函数。
2.3.显示调用复制构造函数
3.默认复制构造函数,会一一复制非静态数据成员。
4.何时需要重写复制构造函数
当牵涉到new动态分配内存的时候,需要考虑是否需要重写。今天实现string类时就遇到了此类问题。
string::string(const char* temp){ //分配的空间比字符串长度大一,多余的空间来存储\0 length = std::strlen(temp); str = new char[length+1]; std::strcpy(str,temp); }
string::string(const string & st){ //复制字符串对象st length = st.length; str = new char[length + 1]; std::strcpy(str,st.str); } string::~string(){ delete[] str; }
如果不重写复制构造函数,即这样:
string::string(const string & st){ str = st.st; length = st.length; }
两个对象的指针都指向同一块内存,当调用析构函数时,会释放同一块内存两次,这将引发程序崩溃。
5.一同需要考虑的是,默认的赋值运算符=,即:operator=()
默认的赋值运算符也是一一复制静态数据成员。所以呢,有new的地方也应该考虑重写。具体如下:
string& string:: operator = (string& st){ //st赋值给当前对象 //对象赋值给自己 if(&st == this)return *this; //释放当前对象的内存 delete[] str; length = st.length; str = new char[length + 1]; std::strcpy(str,st.str); return *this; }
源码:https://github.com/pyj2333/cpp-data_structure.git
注意:当自身类的引用作为类成员函数参数
时,这个引用的类可以直接访问数据成员。
比如说
string& string:: operator = (string& st){
}
st可以直接访问私有数据成员str。
另外,类成员函数下面本类的对象也可以直接访问私有数据成员。
标签:指针 按引用传递 ref strlen 拷贝 bsp 动态 div 自己
原文地址:https://www.cnblogs.com/jielearscoding/p/12748618.html