构造

#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

构造函数只有在新建类时才会调用,如果使用命名空间方法(::)调用类中的静态方法,那么构造函数将不会被调用。如果一个类,他只有静态方法,那么新建这个类的时候将不会调用构造函数,如果调用构造函数也会出错。

猜你喜欢

转载自www.cnblogs.com/wangtianning1223/p/12674687.html