当前位置: 首页 > news >正文

wordpress启用主题网站出错台州网站注册 公司

wordpress启用主题网站出错,台州网站注册 公司,做外贸业务去哪些网站,北京网站设计十年乐云seo目录 一、隐式类型转换的概念 二、隐式转换的底层机制 三、内置类型的隐式转换示例 四、explicit关键字的作用 五、类类型之间的转换 1、代码结构分析 2、隐式类型转换的三种场景 1. 内置类型到类类型的隐式转换 2. 多参数列表初始化隐式转换(C11起&#xf…

目录

一、隐式类型转换的概念

二、隐式转换的底层机制

三、内置类型的隐式转换示例

四、explicit关键字的作用

五、类类型之间的转换

1、代码结构分析

2、隐式类型转换的三种场景

1. 内置类型到类类型的隐式转换

2. 多参数列表初始化隐式转换(C++11起)

3. 类类型之间的隐式转换(同上面的内置类型到类类型的隐式转换)

3、关键概念解析

临时对象生命周期

隐式转换的优缺点

4、探讨:A 和 B 的构造函数参数设计差异

1. A 的构造函数采用传值的原因

2. B 的构造函数采用 const A& 的原因

3. 如果 A 的构造函数改用引用

4. 如果 B 的构造函数改用传值

通用设计原则总结

六、使用建议


一、隐式类型转换的概念

        在C++中,构造函数不仅可以构造和初始化对象,对于单个参数的构造函数,还支持隐式类型转换。这种特性允许编译器自动将一种类型转换为另一种类型,而不需要显式的类型转换操作。

#include <iostream>
using namespace std;class Date {
public:Date(int year = 0)  // 单个参数的构造函数: _year(year) {}void Print() {cout << _year << endl;}private:int _year;
};int main() {Date d1 = 2021;  // 支持隐式类型转换d1.Print();return 0;
}

二、隐式转换的底层机制

在语法上,代码Date d1 = 2021等价于以下两步操作:

  1. Date tmp(2021); // 先构造临时对象

  2. Date d1(tmp); // 再拷贝构造

        在现代编译器中,这个过程已经被优化为直接构造(Date d1(2021)),这种优化称为"拷贝省略"或"返回值优化"(RVO/NRVO)。


三、内置类型的隐式转换示例

实际上,我们经常使用内置类型的隐式转换而不自知:

int a = 10;
double b = a;  // 隐式类型转换

        在这个过程中,编译器会先构建一个double类型的临时变量接收a的值,然后再将该临时变量的值赋给b。这就是为什么函数可以返回局部变量的值,因为当函数被销毁后,虽然作为返回值的变量也被销毁了,但是隐式类型转换过程中所产生的临时变量并没有被销毁,所以该值仍然存在。


四、explicit关键字的作用

        对于单参数的自定义类型来说,Date d1 = 2021这种代码虽然方便,但可读性可能不佳。如果我们想禁止单参数构造函数的隐式转换,可以使用explicit关键字修饰构造函数:

class Date {
public:explicit Date(int year = 0)  // 使用explicit禁止隐式转换: _year(year) {}// ...
};int main() {// Date d1 = 2021;  // 错误:不能隐式转换Date d1(2021);     // 必须显式调用构造函数d1.Print();return 0;
}

五、类类型之间的转换

        C++不仅支持内置类型到类类型的隐式转换,还支持类类型之间的隐式转换,这需要通过适当的构造函数实现:

#include <iostream>
using namespace std;class A {
public:// explicit A(int a1)  // 使用explicit将禁止隐式转换A(int a1): _a1(a1){}// explicit A(int a1, int a2)  // 多参数构造函数A(int a1, int a2): _a1(a1), _a2(a2){}void Print() {cout << _a1 << " " << _a2 << endl;}int Get() const {return _a1 + _a2;}private:int _a1 = 1;int _a2 = 2;
};class B {
public:B(const A& a): _b(a.Get()){}private:int _b = 0;
};int main() {// 隐式转换:int -> AA aa1 = 1;  // 等价于 A aa1(1);aa1.Print();const A& aa2 = 1;  // 同样支持// C++11开始支持多参数列表初始化隐式转换A aa3 = {2, 2};// 类类型之间的隐式转换:A -> BB b = aa3;const B& rb = aa3;return 0;
}

1、代码结构分析

这段代码展示了C++中的隐式类型转换机制,主要包含两个类:

  1. A:有两个构造函数(单参数和多参数版本)

  2. B:以类A对象为参数的构造函数

2、隐式类型转换的三种场景

1. 内置类型到类类型的隐式转换

A aa1 = 1;  // int隐式转换为A类对象
const A& aa2 = 1;  // 同样适用

工作原理

  1. 编译器发现需要A类型但提供了int

  2. 查找A类中是否有接受int的构造函数

  3. 找到A(int a1)构造函数

  4. 用这个构造函数创建一个临时A对象

  5. 用临时对象初始化aa1或绑定到aa2引用

  6. 第二个加上const修饰引用为权限的平移,同时临时对象的生命周期很短(通常到分号结束),加上const,生命周期会延长到引用作用域结束

注意:如果给构造函数加上explicit关键字,这种隐式转换将被禁止。

2. 多参数列表初始化隐式转换(C++11起)

A aa3 = {2, 2};  // 使用初始化列表隐式构造

特点

  • C++11引入的新特性

  • 需要类中有对应的多参数构造函数

  • 比单参数隐式转换更清晰直观

3. 类类型之间的隐式转换(同上面的内置类型到类类型的隐式转换)

B b = aa3;  // A类型隐式转换为B类型
const B& rb = aa3;  // 同样适用

工作原理

  1. 编译器发现需要B类型但提供了A

  2. 查找B类中是否有接受A的构造函数

  3. 找到B(const A& a)构造函数

  4. 用这个构造函数创建B对象

3、关键概念解析

临时对象生命周期

const A& aa2 = 1;  // 临时对象生命周期延长
  • 临时对象通常会在表达式结束时销毁,也就是在分号处结束

  • 但当绑定到const引用时,生命周期会延长到引用作用域结束

隐式转换的优缺点

优点

  • 代码简洁,减少显式转换的冗余

  • 提高API的易用性

缺点

  • 可能隐藏潜在的性能开销(临时对象创建)

  • 降低代码可读性,特别是复杂转换链

  • 可能导致意外的行为转换

4、探讨:A 和 B 的构造函数参数设计差异

1. A 的构造函数采用传值的原因

A(int a1) : _a1(a1) {}       // 传值
A(int a1, int a2) : ... {}   // 传值
  • 内置类型的性能考量:int 是内置类型(POD),其传值和传引用的开销几乎相同。传值反而可能更高效,因为:避免间接访问(解引用指针)、编译器更容易优化(如寄存器传递)

  • 隐式类型转换的需求:如果参数改为 const int&,虽然可行,但会引入不必要的间接访问,且对内置类型无实际收益。

  • 代码简洁性:简单场景下,传值更直观。

2. B 的构造函数采用 const A& 的原因

B(const A& a) : _b(a.Get()) {}  // const 引用
  • 避免对象拷贝开销:A 是自定义类类型,传值会导致拷贝构造(调用 A 的拷贝构造函数),而传引用:仅传递指针大小的地址(64 位系统为 8 字节)、适合可能包含大量数据的类(尽管本例中 A 很小,但这是通用最佳实践)

  • 支持 const 正确性:const A& 表明:不会修改传入的 A 对象(安全)、可以接受临时对象(如 B b = A(1);

  • 兼容隐式转换:允许直接传递 A 的临时对象(如 B b = 1;,需 A 支持从 int 隐式转换)。

3. 如果 A 的构造函数改用引用

假设 A 的构造函数改为引用:

A(const int& a1) : _a1(a1) {}  // 改用 const 引用
  • 行为相同,但无实际优势对 int 等小类型,传引用反而可能:增加间接访问开销、阻碍编译器优化(如常量传播)

  • 仅特定场景有用:例如需要观察外部变量的变化:

    int global_val;
    A(const int& a1) : _a1(a1) {}  // 可以跟踪 global_val 的变化

4. 如果 B 的构造函数改用传值

假设 B 的构造函数改为传值:

B(A a) : _b(a.Get()) {}  // 传值(不推荐)
  • 性能问题:每次调用会触发 A 的拷贝构造,若 A 包含大量数据(如动态数组),开销显著。

  • 可能意外切割派生类:如果 A 有子类,传值会导致对象切割(Slicing),而引用会保留多态性。

通用设计原则总结

场景推荐方式原因
内置类型参数传值(如 int拷贝开销低,编译器易优化
小型自定义类型传值或 const&根据是否需避免拷贝权衡(通常 < 16 字节可考虑传值)
大型自定义类型const T& 或 T&&避免拷贝开销,右值引用(&&)可支持移动语义
需修改的参数非 const 引用明确表达意图(如 void update(A& a)
临时对象支持const T& 或 T&&允许绑定右值(临时对象)

六、使用建议

  1. 谨慎使用隐式转换:虽然方便,但可能降低代码可读性,特别是在大型项目中

  2. 优先使用explicit:对于单参数构造函数,除非有明确需要,否则建议使用explicit关键字

  3. 注意C++11的多参数转换:C++11开始支持使用初始化列表进行多参数隐式转换(直接使用=)

隐式类型转换是一把双刃剑,合理使用可以提高代码简洁性,滥用则可能导致难以发现的错误。

http://www.dtcms.com/a/522099.html

相关文章:

  • 广州新塘网站seo优化下载网站cms
  • 徐州网站建设方案书用网站做简历
  • 建筑网片用于哪些地方seo全网推广营销软件
  • 阜新门户网站建设福州开发公司
  • 制作投票网站html5 网站正在建设中
  • 做笑话网站赚钱怎么用自己的电脑建设网站
  • 东莞网站推广排名app开发网站建设公司
  • 大连网站建设吗海外网络推广专员
  • 闵行工程建设网站旅游网站的市场需求怎么做介绍
  • 如何创造一个网站河北邯郸市简介
  • 一个企业为什么要建设网站网络营销自学课程
  • Java—面向对象编程、类的基本语法
  • 鞍山新款网站制作哪家好小程序平台入口
  • 做债的网站永久免费建站地址
  • 品牌网站建设意义网站内容与模板设计
  • 深圳制作网站专业wordpress移动底部菜单插件
  • 注册网站需要房产证网站开发交易网站
  • 建设工程规划许可证网站Wordpress 修改 mysql 插件
  • 网站建设的基本流程可分为企业文化网站建设
  • 国内最好的网站建设网店推广的重要性
  • 重庆交通大学官网网站深圳网站建设公司服务
  • 住房城乡与建设厅网站angular适合 做 网站吗
  • 网站开发的几种语言让wordpress文章页面显示分类标签
  • SOAP Body 元素
  • 为企业规划网站注意什么建设营销网站多少钱
  • wordpress 整站下载网站设计开发文档模板下载
  • 合肥网站建设技术托管举报网站建设情况 汇报
  • 阿里云网站建设认证答案做网站guangxiyanda
  • 动态购物网站开发源代码wordpress 预定插件
  • 太原百度seo网站建设wordpress设置首页