c++复制构造函数使用
2021-02-09 19:20
标签:指针 按引用传递 ref strlen 拷贝 bsp 动态 div 自己 1.复制构造函数原型 两个值得思考的地方: 1.1.为什么这里参数是常量?其实这里不用常量也可以,只不过会存在一个问题。如果我们利用临时对象作为参数调用复制构造函数。 由于非常量的引用不能指向临时对象,所以不可以这样做。参考这篇博文:https://www.cnblogs.com/BensonLaur/p/5234555.html 1.2.为啥是按引用传递?按值传递可以吗?不可以按值传递,原因是按值传递是首先拷贝这个值,必然又会调用复制构造函数,函数就变成了死循环, 这tm不是递归调用嘛。 2.何时会调用 2.1.函数按值传递对象时,会复制对象,调用复制构造函数 2.2.函数返回对象时,会先把这个对象复制一份,调用复制构造函数。 2.3.显示调用复制构造函数 如果不重写复制构造函数,即这样: 两个对象的指针都指向同一块内存,当调用析构函数时,会释放同一块内存两次,这将引发程序崩溃。 5.一同需要考虑的是,默认的赋值运算符=,即:operator=() 源码:https://github.com/pyj2333/cpp-data_structure.git 注意:当自身类的引用作为类成员函数参数 另外,类成员函数下面本类的对象也可以直接访问私有数据成员。 c++复制构造函数使用 标签:指针 按引用传递 ref strlen 拷贝 bsp 动态 div 自己 原文地址:https://www.cnblogs.com/jielearscoding/p/12748618.htmlclass_name(const class_name&)
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;
}
默认的赋值运算符也是一一复制静态数据成员。所以呢,有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;
}
时,这个引用的类可以直接访问数据成员。
比如说
string& string:: operator = (string& st){
}
st可以直接访问私有数据成员str。
上一篇:关于斐波那契数列的算法
下一篇:5.线性回归算法