构造
#include<iostream> class Entity { public: float x,y; void Print() { std::cout<<x<<","<<y<<std::endl; } }; int main() { Entity e; e.Print(); std::cin.get(); }
运行上述代码发现结果如下
我们得到了两个完全随机的位置信息x,y,这是因为我们实例化Entity这个类并为它分配内存的时候,并没有对内存进行初始化操作,这就意味着内存空间中开始的时候存什么我们就显示什么,我们需要做的是初始化内存然后将xy赋一个0或者其他什么别的初值。
由于xy是公有的,所以我们也可以在主函数中通过类来打印他
Entity e; std::cout<<e.X<<","<<e.Y<<std::endl;
如果我们在主函数中做如下修改,那么会发现编译器报错
在编译过程中出现错误,由于内存没有被初始化,所以编译无法通过,无论以上那两种方式都是我们不想要的打印方法,所以这是就需要一种初始化方法,使我们每次构造Entity类的时候都能够将xy设为0或者其他的初值,所以我们需要在类中创建一个初始化
class Entity { public: float x,y; void Init() { x=0.0f; y=0.0f; } void Print() { std::cout<<x<<","<<y<<std::endl; } };
然后再每次新建一个类时都调用这个函数
Entity e;
e.Init();
这时打印出来的xy就都是0了,但是这个Init()函数是我们额外手写出来的代码,每日此我们想要新建一个Entity类的时候我们都需要运行Init()函数,这样会使代码量增加并且一点都不简洁,这时就需要构造。构造函数会在每次类被新建的时候被调用。
定义方法:就像定义其他函数一样,不过构造函数是没有返回值的,并且它的名字必须和类的名字相同
class Entity { float x,y; Entity() { x=0.0f; y=0.0f; } void Print() { std::cout<<x<","<<y<<std::endl; } };
此时运行代码,我们不需要再对Entity类内的xy进行初始化了,初始化任务已经被构造函数完成了。如果不在类内新建构造函数,类中仍会存在默认构造函数,但是这个函数什么都不会做。事实上我们可以写无数多个构造函数,想写多少就写多少,还可以给构造函数加上输入变量
#include<iostream> class Entity { float X,Y; Entity() {} Entity(float x,float y) { X=x; Y=y; } void Print() { std::cout<<X<<","<<Y<<std::endl; } }; int main() { Entity e(10.0f,5.0f); e.Print(); std::cin.get(); }
此时打印的值是10,5
构造函数只有在新建类时才会调用,如果使用命名空间方法(::)调用类中的静态方法,那么构造函数将不会被调用。如果一个类,他只有静态方法,那么新建这个类的时候将不会调用构造函数,如果调用构造函数也会出错。
无情的摸鱼机器