new关键字
再次强调了new的各种用法,比如可以用在类、基本类型以及数组上:在内存上找到一个足够我们使用的内存块,然后分配一个指向那个地址的指针。
int* b = new int;
Entity* e1 = new Entity[50];、
delete e;
delete[] e1;
在堆上声明的,使用过后一定要记得释放内存,数组释放内存需要加上 []。一些C++策略可以让这个过程变得自动化,比如基于作用域的指针,也有些高级的策略及,比如引用计数。
Entity* e1 = new Entity;
Entity* e = (Entity*)malloc(sizeof(Entity));
上述两种声明方式,除了第一种方法会自动调用构造函数外,其他并无区别。这也是C++通常并不会按照第二种方式声明的原因,可读性太差。
int* b = new int;
Entity* e1 = new(b) Entity[50];
这是一种叫做placement new的用法,可以支持e1申请内存在b指针之后的内存开始,如果内存空间不够编译器就会抛出异常,这里对placement new本节不过多介绍~
explicit关键字
class Entity {
private:
std::string m_Name;
int m_Age;
public:
Entity(const std::string& name)
: m_Name(name),m_Age(-1){ }
Entity(int age)
: m_Name("Unknown"),m_Age(age) {}
};
void PrintEntity(const Entity& entity){}
int main() {
}
在上述代码情况下,使用age作为初始化参数构造对象的方式有以下几种:
Entity b(22);
Entity b = Entity(22);
Entity b = 22;
在使用name来构造就会发生变化,原因在于char类型和std::string类型并不通用,需要做二次类型转化(char->std::string->Entity),而隐性的类型转化只支持一次。
Entity a("lhx");
Entity a = Entity("lhx");
Entity a = std::string("lhx");
通常为了代码可读,并不会使用最后一种方式。