-
被定义为常对象的函数才能调用常成员函数
查看全部 -
!!!Array
return *this;
返回的是一个临时的新对象,之后对返回值的操作,不会影响到this原本指向的对象。
但是!
Array&
return *this;
引用符号&的引入可以改变原this指向的对象.
查看全部 -
Coordinate coord[3]: 栈的实例化方式,用"."调用;
Coordinate *p = new Coordinate[3]: 堆的实例化方式,用"p[]."或"p->"调用,一定要delete配套销毁delete []p
查看全部 -
Array& printInfo() {
return *this; //没有“&”,返回的是一个临时对象
}
return *this返回的是当前对象的克隆或者本身(若返回类型为A, 则是克隆, 若返回类型为A&, 则是本身的引用 )
查看全部 -
两种实例化用法
查看全部 -
动画控制函数
查看全部 -
为什么要用Array&呀
Array& printinfo()
{
return *this;
}
为什么要用Array&,直接返回Array不行么
2015-10-17源自:C++远征之封装篇(下) 4-8845 浏览3 回答
最佳回答
2015-10-18
可以直接返回Array,但这样并不好。
&这表明返回的是array引用。
类成员函数有时打算返回类实例自身,就会返回*this的引用。
而有时并不一定需要返回自身,但仍会选择返回引用,原因如下:
函数在返回值的时候,是先用你要返回的变量去构造一个临时变量,再将这个临时变量返回给接受返回值的调用者。在调用者使用过后,这个临时变量再被自动销毁。
如果返回的是一个很大的类实例的话,构造这个临时变量会调用拷贝构造函数,这可能造成很大的运行开销(例子中的情况下array会被整个复制一遍)。为了减少这种负面影响,在一些情况下会选择返回引用类型。注意:这不会改变函数返回时的行为,即——还是会将这个引用临时复制一份——但复制引用类型的开销基本上可以忽略不计。
但需要万分注意:返回引用类型时必须要保证被引用的变量要在函数退出后仍存在(不然返回的那个引用指向谁呢?!) 当然这个代码中这样用没有问题,因为在调用过后 arr1 肯定还是存在的。
P.S. 较新的C++11标准中增加了“右值引用”特性,很好地解决了函数返回时临时变量的麻烦。
+3积分什么是积分?
举报 回复 5
续上,没看完整个视频,回答得不准确。 看到视频中在调用过 printinfo 函数后,紧接着又调用了 setLen。 那么如果是直接返回Array,则调用setLen是调用那个临时变量的setLen,也就是改变的是临时变量的len。 arr1的len不会有任何改变。 既然目的是要返回类实例自身,就更要将返回类型声明为引用了。
#12015-10-18 回复 举报
查看全部 -
C语言中malloc知识单纯的分配内存空间,而new不但会分配内存空间,还会调用对象的构造函数
查看全部 -
走迷宫案例:
左手原则:想象自己在家左手扶着墙一直走。
右手原则:想象自己在家右手扶着墙一直走。
要建立两个类,迷宫类和人
成就感源于克服困难
查看全部 -
对象的引用与对象的指针。
对象的常指针与常引用
查看全部 -
重要,返回引用查看全部
-
未做笔记i
查看全部 -
一个对象中包含其他对象:对象成员
至少定义两个类,一个定义点,一个定义线段。
点的定义:
线段的定义:其中包括两个点
实例化一条线段:先实例化A这个坐标点,再实例化B这个坐标点,最后实例化Line,销毁过程与实例化过程正好相反。
但坐标点类的构造函数应该需要参数:
利用初始化列表:
查看全部 -
delete []p;执行了三次析构函数
若不加[],则只执行一次析构函数
查看全部 -
//demo.cpp #include <iostream> #include <stdlib.h> #include <Coordinate.h> using namespace std; int main(void){ Coordinate coor[3];//从栈 coor[0].m_iX = 3; coor[0].m_iY = 5; Coordinate *p = new Coordinate[3];//从堆中 p->m_iX = 7; p[0].m_iY = 9;//这样写不要用->,用点号 p++;//p = p + 1;指向了第二个元素 p->m_iX = 11; p[0].m_iY = 12;//此时访问到的是第二个元素 p[1].m_iX = 15;//第三个元素 p++; p->m_iY = 17; //遍历对象数组 for(int i = 0; i< 3;i++){ cout << "coor_x"<<coor[i].m_iX << endl; cout << "coor_x" << coor[i].m_iY << endl; } for(int j = 0;j < 3;j++){//区分j和p[]的作用 cout << "p_x" << p->m_iX << endl; cout << "p_y" << p->m_iY << endl; p--; } //注意理解 p++; delete []p; p = NULL; system("pause"); return 0; }
查看全部
举报