new关键字&&explicit关键字(C++基础)

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");

通常为了代码可读,并不会使用最后一种方式。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想进大厂~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值