如果没有初始化变量
构造类Enity,在主函数里实例化,调用Enity类中的Print函数
#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();
}
得到结果为原内存中的数字,与java每次定义变量后初始化为0不同,所以在c++中你需要手动初始化所有基本类型。
尝试直接调用未初始化的变量
#include<iostream>
class Entity
{
public:
float X, Y;
void Print()
{
std::cout << X <<","<< Y << std::endl;
}
};
int main(){
Entity e;
std::cout << e.X << std::endl;//调用未初始化变量
e.Print();
std::cin.get();
}
得到报错
初始化变量
创建Init初始化,
#include<iostream>
class Entity
{
public:
float X, Y;
void Init()
{
X = 0.0f;
Y = 0.0f;
}
void Print()
{
std::cout << X <<","<< Y << std::endl;
}
};
int main(){
Entity e;
e.Init();
std::cout << e.X << std::endl;
e.Print();
std::cin.get();
}
正常运行
但随之而来的问题是如果我们每次要创建一个Enity对象,都要运行一次Init初始化,额外增加了代码量。所以就有了构造函数。
构造函数
每次构造对象时构造函数都会自动调用。
#include<iostream>
class Entity
{
public:
float X, Y;
Entity()
{
X = 0.0f;
Y = 0.0f;
}
void Print()
{
std::cout << X <<","<< Y << std::endl;
}
};
int main(){
Entity e;
std::cout << e.X << std::endl;
e.Print();
std::cin.get();
}
得到相同的结果,不加图了。
其实每个类里c++都会自动写一个构造函数,叫做默认构造函数,不过是空的,就像
Entity(){}
带参数的构造函数
构造函数可以写很多个,只要它们的参数是不同的就可以,函数重载的原理。
#include<iostream>
class Entity
{
public:
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(1.0f, 4.0f);
e.Print();
std::cin.get();
}
如何删除构造函数
1.第一方法设置为private
private:
Entity(){}
2.第二种方法
Entity()=delete;
当你不想让其他人构造实例,可以通过删除构造函数的方式。
总结
构造函数的主要作用是当你想要实例化对象时,自动帮你初始化,包括初始化变量或自动建立一些你想要的设置。
参考:https://www.bilibili.com/video/BV1Wd4y1t7fZ?p=25&vd_source=62ff2902fe17c519d8bc1bcdb761dd91