C++本来是在下学期的数据结构学的,但是本学期期末考试也会涉及,涉及的内容是“constructors,destructors,and overloading”。然后自己学习的话主要是结合菜鸟教程去理解这些内容。因为是期末考试必考内容,所以在这里做一个汇总。
Mystery
做了下批注。
#include <stdio.h>
class Mystery{
private:
int x;
public:
Mystery(){printf("M");} //每构造一次函数打印“M”
Mystery(int xval):x(xval+1){printf("Y");}//xval作为参数传入
const Mystery& operator= (int xval){
xval = 1;
printf("S");
return *this;
}//“=”运算符重载
Mystery(const Mystery& m):Mystery(m.x+10){printf("T");}//对象作为参数传入
~Mystery(){printf("E");}//每析构一次函数打印“E”
};
Mystery c,d; //先创建c对象,d对象
int main(){
printf("---START---\n");
c = d = 0;
printf("\n");
Mystery a = 42;
printf("\n");
Mystery b = a;
printf("\n");
c = a;
printf("\n---END---");
return 0;
}
运行的结果如下:
我们由main函数从上到下依行分析,有这么几点。
创建对象与main函数关系
由此可见,创建对象要放在main函数前。当然在main函数里面创建另说。
析构函数
由上述结果可知,应该是在return 0之后再析构函数的。一共创建了四个对象,c,d,a,b,所以E打印四次。
重载运算符(c=d=0)
我觉得重载运算符的难点在于如何判断这个符号使用了重载运算符。C++ 重载运算符和重载函数 | 菜鸟教程 (runoob.com)
重载的运算符是带有特殊名称的函数,函数名是由关键词operator和其后要重载的运算符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。
//例子 Box operator+(const Box&);
声明加法运算符用于把两个Box对象相加,返回最终的Box对象。大多数的重载运算符可被定义为普通的非成员函数或者被定义为类成员函数。如果我们把定义上面的函数为类的非成员函数,那么我们需要为每次操作传递两个参数,如下所示:
Box operator+(const Box&, const Box&);
下面的实例使用成员函数演示了运算符重载的概念。在这里,对象作为参数进行传递,对象的属性使用this运算符进行了访问,如下所示:
#include <iostream> using namespace std; class Box { public: double getVolume(void) { return length * breadth * height; } void setLength( double len ) { length = len; } void setBreadth( double bre ) { breadth = bre; } void setHeight( double hei ) { height = hei; } // 重载 + 运算符,用于把两个 Box 对象相加 Box operator+(const Box& b) { Box box; box.length = this->length + b.length; box.breadth = this->breadth + b.breadth; box.height = this->height + b.height; return box; } private: double length; // 长度 double breadth; // 宽度 double height; // 高度 }; // 程序的主函数 int main( ) { Box Box1; // 声明 Box1,类型为 Box Box Box2; // 声明 Box2,类型为 Box Box Box3; // 声明 Box3,类型为 Box double volume = 0.0; // 把体积存储在该变量中 // Box1 详述 Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); // Box2 详述 Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); // Box1 的体积 volume = Box1.getVolume(); cout << "Volume of Box1 : " << volume <<endl; // Box2 的体积 volume = Box2.getVolume(); cout << "Volume of Box2 : " << volume <<endl; // 把两个对象相加,得到 Box3 Box3 = Box1 + Box2; // Box3 的体积 volume = Box3.getVolume(); cout << "Volume of Box3 : " << volume <<endl; return 0; }
当上面的代码被编译和执行时,它会产生下列结果:
Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400
从菜鸟教程的这个例子,Box3 = Box1 + Box2,相当于把return的box赋给了Box3。
类似地,d=0,相当于把0传递给xval,然后加载这个函数(重载运算符),把xval改为1,打印S,然后再返回d的pointer。接着的c=d,便是把指向d的pointer赋给了c。
带参数的构造函数(Mytery a = 42)
Mstery a = 42, 可以理解为Mystery(42),也就是为什么不调用重载运算符的缘故,按照上式,即a.x = xval + 1,a.x=43,然后打印出Y,再换行。
带参数的构造函数(Mystery b = a)
答案的第四行是YT,a是作为参数传入到m,所以有Mystery(a.x+10){printf("T")},因为Mystery(53),可知b.x = xval + 1,b.x = 54,接着打印Y,最后再把T打印出来,所以是YT
a的指针也指向c(c=a)
所以c.x也是43。
因为没有参数传入d,所以d.x确实只能是bits。。。。。。
这个例子理解的话,下面的这个例子就不难了~
Tricky
答案是
-9
45
-3
有时间的话回来写写~