普通的初始化方法#
#include <iostream>
#include <string>
class Entity
{
private :
std::string m_Name;
public:
Entity()
{
m_Name = "Unknown";
}
Entity(const std::string& name)
{
m_Name = name;
}
const std::string& GetName() const { return m_Name; }
};
int main()
{
Entity e0;
std::cout << e0.GetName() << std::endl;
Entity e1("Cherno");
std::cout << e1.GetName() << std::endl;
std::cin.get();
}初始化列表#
#include <iostream>
#include <string>
class Entity
{
private:
int m_Score;
std::string m_Name;
public:
//如果不是用初始化列表,就会先调用成员变量的构造函数初始化给它默认值(这里是m_Name),然后在{}中再一次赋值
//如果用了,那就直接使用初始化列表中的值初始化
//第二种方式只调用了string(const char*),而第一种方式多调用了一次string()
Entity()
:m_Name("Unknown"),m_Score(0) //注意不论这里的书写顺序是啥
//都是先初始化m_Score,再m_Name
{
}
Entity(const std::string& name)
: m_Name(name)
{
}
const std::string& GetName() const { return m_Name; }
};
int main()
{
Entity e0;
std::cout << e0.GetName() << std::endl;
Entity e1("Cherno");
std::cout << e1.GetName() << std::endl;
std::cin.get();
}构造函数的“幕后”过程#
初始化阶段:以下只针对类对象,基本类型不会被自动初始化(除非是全局变量:全局变量会被清零),它们的值是内存中残留的随机垃圾值。
当你调用一个构造函数时,程序执行并不是直接跳到 { 里的第一行代码,而是经历了两个阶段:
初始化阶段 (Initialization Phase):按照成员变量在类中声明的顺序,逐个调用它们的构造函数。
如果你写了“初始化列表”,编译器就按你指定的参数初始化;如果你没写,编译器会尝试调用这些成员的默认构造函数(无参构造函数)。
赋值阶段 (Assignment Phase):此时所有成员已经“诞生”了。
执行构造函数大括号 { } 里的代码,这通常是执行“赋值”操作。
示例-{}中初始化#
#include <iostream>
#include <string>
class Example
{
public:
Example()
{
std::cout << "Created Entity " << std::endl;
}
Example(int x)
{
std::cout << "Created Entity with " << x << std::endl;
}
};
class Entity
{
private:
std::string m_Name;
Example m_Example;
public:
Entity()
{
m_Name = std::string("Unknown");
m_Example = Example(8);
}
const std::string& GetName() const { return m_Name; }
};
int main()
{
Entity e0;
std::cin.get();
}
/*打印
Created Entity
Created Entity with 8
*/示例-初始化列表#
#include <iostream>
#include <string>
class Example
{
public:
Example()
{
std::cout << "Created Entity " << std::endl;
}
Example(int x)
{
std::cout << "Created Entity with " << x << std::endl;
}
};
class Entity
{
private:
std::string m_Name;
Example m_Example;
public:
Entity()
:m_Name("Unkown"),m_Example(8)
{
}
const std::string& GetName() const { return m_Name; }
};
int main()
{
Entity e0;
std::cin.get();
}
/*打印
Created Entity with 8
*/