构造函数在你初始化的时候会调用,老师的代码里那个构造函数是有cout<<Coordinate()<<endl;故初始化调用构造函数时会执行cout<<Coordinate()<<endl;
析构函数是在销毁时调用,打印原理如上;
把你的代码发出来,可是头函数定义有问题
这是初始化方式(完整的代码应该还有delete,这里我偷了个懒)。如果只是单纯的赋值的话,也可以将属性封装为一个set()函数,类似 void setX(int x){m_iX = x}; (前面课程有讲)然后调用该函数为属性赋值。
可以借用循环直接输入数组值
你把// system("pause"); 中//注释去掉
这样也是可以的,想必是C语言中常用方法和思想。老师的视频无非是想告诉我们记得delete时指针的地址要返回到数组首地址罢了,所以才这样子写。
执行第二个p++时,指针头已经在第三个对象数组了,所以是p[0]不是p[1]
我知道了,要在第一个元素开始销毁,在delete []p;前加p = p-2;
因为在执行玩对数组成员的赋值之后指针P指向的是最后一个元素的地址
system("pause")就是说运行结束时窗口不会马上退掉,而是会停留一会
能把你的代码截图吗,你这样复制进来看起来好乱
好像我们的操作系统可以把一些不正常运行的程序强制杀死吧
coordinate coor[3]={coordinate(1,2),coordinate(3,4),coordinate(5,6)};//对每个成员调用构造函数初始化,在之前要有相应的构造函数
P++以后指针就指向下一个数组元素,这时的P[0]即为之前的p[1],p[1]即为之前的P[2],以此类推
我觉得不是纰漏,而是故意的!原因是在主程序中m_iX和m_iY多次被调用了,只有在public下才能被调用,private的成员在主函数中是禁止调用的!可以将老师的代码声明中的第二个public改为private,估计程序就不能运行了(本人没有验证)。
至于为啥有两个,一个放成员函数,另一个是数据成员,应该可以合并。(未实践)
因为(p++)的返回值是原始的值,执行完之后,p的值才变了的。我一直是这么理解的。
相关的问题可能具体的代码需要进行反汇编之后看汇编代码进行分析的。不同的编译器对代码有不同的优化。
个人感觉现在的++和--这个坑还是蛮大的。
# include <iostream>
using namespace std;
class Coordinate
{
public:
Coordinate(){cout << "Coordinate()" << endl;}
~Coordinate(){cout << "~Coordinate()" << endl;}
int m_iX;
int m_iY;
};
int main()
{
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 -> m_iX = 11;
p[0].m_iY = 13;
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_y = " << coor[i].m_iY << endl;
}
for(int j=0;j<3;j++)
{
cout << "p_x = " << p -> m_iX << endl;
cout << "p_y = " << p -> m_iY << endl;
p--;
}
p++;
delete []p;
p = NULL;
return 0;
}
因为你的P数组有5个单位啊。它就会回收5个。 所以有5次。