湖州网站设计,山东省质量建设监督总站网站,深圳无间设计,网站开发流程视频前言
使用default和delete关键字来干预编译器自动生成的函数。让我详细解释一下这些知识点#xff1a;
正文
编译器生成的默认构造函数#xff1a; 如果类A没有定义任何构造函数#xff0c;那么编译器会自动生成一个无参的默认构造函数 A()。这个默认构造函数实际上是一个…前言
使用default和delete关键字来干预编译器自动生成的函数。让我详细解释一下这些知识点
正文
编译器生成的默认构造函数 如果类A没有定义任何构造函数那么编译器会自动生成一个无参的默认构造函数 A()。这个默认构造函数实际上是一个空操作类似于一条return语句它不执行任何实际的操作。 用户定义的构造函数 如果类A定义了任何构造函数无论是有参还是无参构造函数编译器就不再自动生成默认的无参构造函数。这是因为如果你手动定义了构造函数编译器默认假设你已经处理了对象的初始化。 编译器生成的复制构造函数 如果类A没有定义带引用参数 A 的复制构造函数 A(const A a)那么编译器会自动生成一个复制构造函数通常使用浅拷贝逐成员复制的方式实现。这个默认生成的复制构造函数会对对象的成员进行一一复制但如果类A包含了指针等资源这种默认的浅拷贝可能会导致问题。 使用default和delete关键字 default关键字可以用来显式告诉编译器你希望使用编译器生成的默认函数。例如如果你定义了其他构造函数但仍希望保留默认构造函数你可以这样写A() default;。这会告诉编译器生成一个默认构造函数。 delete关键字用来告诉编译器你希望删除某个函数使其不可用。例如如果你不希望编译器生成默认的复制构造函数你可以这样写A(const A a) delete;。这会告诉编译器禁用该复制构造函数。 总之使用default和delete关键字可以用来显式指定编译器生成或删除某个特殊成员函数从而更精确地控制类的行为以符合你的需求同时防止不希望发生的隐式行为。 我们看向 problem 1 结果会正常无参构造函数会被调用 2 结果会正常因为本身默认就会有这个构造函数 3 报错这个构造函数被我们删掉了