学习C++——有关返回对象的总结
2015-01-13 19:25
375 查看
当成员函数或独立的函数返回对象的时候,有几种返回方式可以选择。
这两种方法都是可行的。
返回对象将调用复制构造函数,而返回引用则不会调用复制构造函数,所以第二个版本的效率更高。
返回的引用,必须是在调用函数中存在的对象,而不能是被调用的函数中的局部对象,否则当函数返回的时候,局部对象也会消失,所以返回的引用没意义了。
因为v1,v2都是const 引用,所以返回类型也必须是const。
重载赋值运算符(StringBad & StringBad::operator=(const StringBad & st) )
operator=()的返回值用于连续 赋值。str3 = str2 = str1;
重载与cout一起使用的<<运算符
operator<<()的返回值用于串接输出。cout << str1 << "hello word.";返回类型必须是 ostream &。如果返回类型是ostream则要求ostream类的复制构造函数,但是ostream没有复制构造函数。
str3 = str1 + str2; 调用复制构造函数,把str1和str2的值保存在一个临时对象中,然后在将临时对象中的值复制到str3中。
如果方法或函数要返回一个没有复制构造函数的类(如ostream类),则要返回一个指向这种对象的引用。
有些方法可以返回对象,也可以返回指向对象的引用,但是应该首选返回引用,因为效率更高。比如:重载的赋值运算符。
1、返回指向const对象的引用
使用const引用的主要原因是提高效率。Vector force1(20,43); Vector force2(45,22); Vector max; max = Max(force1,force2); //版本1 Vector Max(const Vector & v1,const Vector & v2) { if(v1.magval() > v2.magval()) return v1; else return v2; } //版本2 const Vector & Max(const Vector & v1,const Vector & v2) { if(v1.magval() > v2.magval()) return v1; else return v2; }总结:
这两种方法都是可行的。
返回对象将调用复制构造函数,而返回引用则不会调用复制构造函数,所以第二个版本的效率更高。
返回的引用,必须是在调用函数中存在的对象,而不能是被调用的函数中的局部对象,否则当函数返回的时候,局部对象也会消失,所以返回的引用没意义了。
因为v1,v2都是const 引用,所以返回类型也必须是const。
2、返回指向非const对象的引用
两种情况:重载赋值运算符(StringBad & StringBad::operator=(const StringBad & st) )
operator=()的返回值用于连续 赋值。str3 = str2 = str1;
重载与cout一起使用的<<运算符
operator<<()的返回值用于串接输出。cout << str1 << "hello word.";返回类型必须是 ostream &。如果返回类型是ostream则要求ostream类的复制构造函数,但是ostream没有复制构造函数。
3、返回对象
如果被返回的对象是被调用函数中的局部变量,则不能按引用的方式返回它,因为在被调用函数执行完之后,局部对象就会调用析构函数。因此当返回到调用函数之后,引用的对象将不再存在。所以这个时候应该返回对象。被重载的算术运算符就是一种情况。str3 = str1 + str2; 调用复制构造函数,把str1和str2的值保存在一个临时对象中,然后在将临时对象中的值复制到str3中。
4、返回const对象
如果Vector::operator+()的返回类型被声明为const Vector,则sum = v1 + v2;正确,但是v1+v2=sum;将错误。总结:
如果方法或函数要返回局部对象,则应该返回对象,而不是返回指向对象的引用。(这种情况下,将使用复制构造函数生成返回的对象)如果方法或函数要返回一个没有复制构造函数的类(如ostream类),则要返回一个指向这种对象的引用。
有些方法可以返回对象,也可以返回指向对象的引用,但是应该首选返回引用,因为效率更高。比如:重载的赋值运算符。
相关文章推荐
- C++学习总结——类和对象、构造函数和拷贝构造函数
- C++函数返回一个对象学习笔记
- C++ 学习总结(十)——C++类与对象,及构造函数,析构函数,拷贝构造函数
- C++学习笔记序列之返回语句区别总结
- C/C++日常学习总结(第二篇)结构体和类的大小及区别&为什么是new一个对象而不是malloc
- C++学习:对象和类详细总结
- 【C++总结】关于函数返回对象析构的问题
- C++学习总结_声明一个对象并实现声明类的方法
- c++面向对象基础学习自我总结
- C++学习总结_指针访问堆内存中创建的对象
- C++ 与“类”有关的注意事项总结(十):类对象数组初始化(三种方法)
- Effective C++学习笔记:必须返回一个对象时不要试图返回一个引用
- 学习C++的基本类和对象的基本知识总结
- 【C++总结】函数形参,返回const对象与非const对象,成员函数,函数指针
- 黑马程序员_学习日记2_有关C#基础知识总结归纳之对象和类型
- C++学习笔记10:返回对象
- [C++学习笔记14]动态创建对象(定义静态方法实现在map查找具体类名对应的创建函数,并返回函数指针,map真是一个万能类)good
- c++入门学习笔记--类和对象
- 从C#重返C++学习过程总结
- c++学习的总结