码迷,mamicode.com
首页 > 编程语言 > 详细

c++复制构造函数使用

时间:2020-04-22 00:17:29      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:指针   按引用传递   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。

 另外,类成员函数下面本类的对象也可以直接访问私有数据成员。

 

c++复制构造函数使用

标签:指针   按引用传递   ref   strlen   拷贝   bsp   动态   div   自己   

原文地址:https://www.cnblogs.com/jielearscoding/p/12748618.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!