为什么有时候C++运算符重载要返回引用,附对象生存周期
来源:互联网 发布:matlab矩阵拼接 编辑:程序博客网 时间:2024/06/05 04:39
---------------------------------------------------------
原因如下:
(1)允许连续赋值,举个栗子:
class CMyString//咳,就拿上课讲过的代码好了{public:CMyString(char *ptr=NULL) {if(ptr != NULL){mpStr = new char[strlen(ptr)+1];strcpy(mpStr, ptr);}else{mpStr = new char[1];*mpStr = 0;}}CMyString(const CMyString &src){mpStr = new char[strlen(src.mpStr)+1];strcpy(mpStr, src.mpStr);}CMyString& operator=(const CMyString &src){if(this == &src)return *this; delete []mpStr; mpStr = new char[strlen(src.mpStr)+1];strcpy(mpStr, src.mpStr);return *this;}//等号重载要记得(1)判断自赋值(2)释放原空间(3)重新申请空间并赋值。~CMyString(){delete []mpStr;mpStr = NULL;} bool operator>(const CMyString &src){return strcmp(mpStr, src.mpStr) > 0;}bool operator<(const CMyString &src){return strcmp(mpStr, src.mpStr) < 0;}bool operator==(const CMyString &src){return strcmp(mpStr, src.mpStr) == 0;} char& operator[](int index){return mpStr[index];} //通过下标访问不仅要实现读的功能也要具有写的功能private:char *mpStr; friend ostream& operator<<(ostream &out, const CMyString &src); friend CMyString operator+(const CMyString &lhs,const CMyString &rhs);//嘛,参数加const不仅是为了防止“原版”被改变也是为了让它既能接收const形参也能接受非const参数
//那为什么加引用呢?这样可以防止传参时对参数进行拷贝以提高效率
};
CMyString operator+(const CMyString &lhs, const CMyString &rhs){
int size = lhs.size() + rhs.size() + 1;char *p = new char[size];strcpy(p, lhs.mpStr);strcat(p, rhs.mpStr);CMyString temp(p);delete []p;return temp;}
ostream& operator<<(ostream &out, const CMyString &src){
out<<src.mpStr;return out;}
int main(){
CMyString str1 = "aaa";CMyString str2 = "bbb";CMyString str3 = str1 = str2;//通过重载实现连续赋值cout<<"str1"<<str1<<endl;cout<<"str2"<<str2<<endl;str3[2] = 'p';//通过下标实现赋值cout<<str3[2]<<endl;//通过下表实现访问cout<<"str3"<<str3<<endl;}
(2)防止返回对象时调用拷贝构造函数、析构函数产生额外开销。
-------------------------------------------------------------------
//对象生存周期
class Test
{
public:
Test(int a=5, int b=5):ma(a), mb(b)//带默认值
private:
int ma;
int mb;
};
Test t1(10,10); //构造t1
//构造t5
int main()
{
Test t2(20,20); //构造t2
Test t3 = t2; //t2拷贝构造t3
static Test t4 = Test(30,30); //直接构造t4(这里有个编译器优化)
t2 = Test(40,40); //构造临时对象给t2赋值,临时对象析构
t2 = (Test)(50,50); //构造临时对象Test(50)给t2赋值,临时对象析构
t2 = 60; //构造临时对象Test(60)给t2赋值,临时对象析构
Test *p1 = new Test(70,70); //堆上 构造对象
Test *p2 = new Test[2]; //堆上 构造数组对象Test()
Test *p3 = &Test(80,80); //构造临时对象,临时对象析构
Test &q = Test(90,90); //构造局部对象,使q成为它的别名
delete p1; //p1析构
delete []p2; //p2析构
}
//p4,t3,t2,t4,t5,t1析构
Test t5(100,100);
- 为什么有时候C++运算符重载要返回引用,附对象生存周期
- C++赋值运算符重载,为什么要返回引用?
- 赋值运算符重载为什么要返回引用
- c++中有些重载运算符为什么要返回引用?
- c++中有些重载运算符为什么要返回引用
- C++运算符重载,+-*/的重载,返回值为什么是对象而不是对象的引用?而流操作符<< 和 >> 却返回的是引用?
- C++运算符重载,+-*/的重载,返回值为什么是对象而不是对象的引用?而流操作符<< 和 >> 却返回的是引用?
- 友元 重载<<运算符为什么要返回ostream的引用?
- 为什么赋值运算符要返回引用?
- 为什么赋值运算符要返回引用?
- c++中重载输出操作符,为什么要返回引用
- 赋值运算符重载函数 返回引用和返回对象的区别
- 为什么运算符重载返回值使用&?
- c++赋值运算符为什么要返回引用?
- /c++赋值运算符为什么要返回引用
- [C++]C++对象的生存周期
- android中引用方法的时候,有时候要new一个对象才能引用,有时候直接.方法就可以了,为什么
- android中引用方法的时候,有时候要new一个对象才能引用,有时候直接.方法就可以了,为什么
- Guava学习笔记:Range
- JS四舍五入函数保留小数点*
- FileReader文件读取API
- CodeForces
- iOS 转盘效果
- 为什么有时候C++运算符重载要返回引用,附对象生存周期
- C语言中static和extern用法的一个小细节
- Linux 进程的概念和管理
- python3.5+django1.9+mySQL
- 4selenium+python 登录
- 用Python和Pygame写游戏-从入门到精通(11)鼠标控制输入
- Java多线程——常用的实现多线程的两种方式
- spark2.2.0全分布式配置
- Java实现单例模式的3中实现方式