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

佛山外贸网站建设特色响应式企业展示型网站

佛山外贸网站建设特色,响应式企业展示型网站,南城仿做网站,邯郸房产信息网官网C中的explicit关键字只能用于修饰只有一个参数的类构造函数#xff0c;它的作用是表明该构造函数是显示的#xff0c;而非隐式的#xff0c;跟它相对应的另一个关键字是implicit#xff0c;意思是隐藏的#xff0c;类构造函数默认情况下即声明为implicit(隐式)。那么显示声…C中的explicit关键字只能用于修饰只有一个参数的类构造函数它的作用是表明该构造函数是显示的而非隐式的跟它相对应的另一个关键字是implicit意思是隐藏的类构造函数默认情况下即声明为implicit(隐式)。 那么显示声明的构造函数和隐式声明的有什么区别呢? 来看下面的例子 class CxString // 没有使用explicit关键字的类声明, 即默认为隐式声明 { public: char *_pstr; int _size; CxString(int size) { _size size; // string的预设大小 _pstr malloc(size 1); // 分配string的内存 memset(_pstr, 0, size 1); } CxString(const char *p) { int size strlen(p); _pstr malloc(size 1); // 分配string的内存 strcpy(_pstr, p); // 复制字符串 _size strlen(_pstr); } // 析构函数这里不讨论, 省略... }; // 下面是调用: CxString string1(24); // 这样是OK的, 为CxString预分配24字节的大小的内存 CxString string2 10; // 这样是OK的, 为CxString预分配10字节的大小的内存 CxString string3; // 这样是不行的, 因为没有默认构造函数, 错误为: “CxString”: 没有合适的默认构造函数可用 CxString string4(aaaa); // 这样是OK的 CxString string5 bbb; // 这样也是OK的, 调用的是CxString(const char *p) CxString string6 c; // 这样也是OK的, 其实调用的是CxString(int size), 且size等于c的ascii码 string1 2; // 这样也是OK的, 为CxString预分配2字节的大小的内存 string2 3; // 这样也是OK的, 为CxString预分配3字节的大小的内存 string3 string1; // 这样也是OK的, 至少编译是没问题的, free释放_pstr内存指针的时候可能会报错, 完整的代码必须重载运算符, 并在其中处理内存释放 上面的代码中, “CxString string2 10;” 这句为什么是可以的呢 在C中, 如果的构造函数只有一个参数时, 那么在编译的时候就会有一个缺省的转换操作将该构造函数对应数据类型的数据转换为该类对象。也就是说 “CxString string2 10;” 这段代码编译器自动将整型转换为CxString类对象实际上等同于下面的操作 CxString string2(10); // 或如下代码 CxString temp(10); CxString string2 temp; 但是上面的代码中的_size代表的是字符串内存分配的大小那么调用的第二句 “CxString string2 10;” 和第六句 “CxString string6 ‘c’;” 就显得不伦不类而且容易让人疑惑。有什么办法阻止这种用法呢答案就是使用explicit关键字。我们把上面的代码修改一下如下 class CxString // 使用关键字explicit的类声明, 显示转换 { public: char *_pstr; int _size; explicit CxString(int size) { _size size; // 代码同上, 省略... } CxString(const char *p) { // 代码同上, 省略... } }; // 下面是调用: CxString string1(24); // 这样是OK的 CxString string2 10; // 这样是不行的, 因为explicit关键字取消了隐式转换 CxString string3; // 这样是不行的, 因为没有默认构造函数 CxString string4(aaaa); // 这样是OK的 CxString string5 bbb; // 这样也是OK的, 调用的是CxString(const char *p) CxString string6 c; // 这样是不行的, 其实调用的是CxString(int size), 且size等于c的ascii码, 但explicit关键字取消了隐式转换 string1 2; // 这样也是不行的, 因为取消了隐式转换 string2 3; // 这样也是不行的, 因为取消了隐式转换 string3 string1; // 这样也是不行的, 因为取消了隐式转换, 除非类实现操作符的重载 explicit关键字的作用就是防止类构造函数的隐式自动转换。 如上面所说 explicit关键字只对有一个参数的类构造函数有效如果类构造函数参数大于或等于两个时是不会产生隐式转换的所以explicit关键字也就无效了。例如 class CxString // explicit关键字在类构造函数参数大于或等于两个时无效 { public: char *_pstr; int _age; int _size; explicit CxString(int age, int size) { _age age; _size size; // 代码同上, 省略... } CxString(const char *p) { // 代码同上, 省略... } }; // 这个时候有没有explicit关键字都是一样的 但是, 也有一个例外, 就是当除了第一个参数以外的其他参数都有默认值的时候, explicit关键字依然有效, 此时, 当调用构造函数时只传入一个参数, 等效于只有一个参数的类构造函数, 例子如下: class CxString // 使用关键字explicit声明 { public: int _age; int _size; explicit CxString(int age, int size 0) { _age age; _size size; // 代码同上, 省略... } CxString(const char *p) { // 代码同上, 省略... } }; // 下面是调用: CxString string1(24); // 这样是OK的 CxString string2 10; // 这样是不行的, 因为explicit关键字取消了隐式转换 CxString string3; // 这样是不行的, 因为没有默认构造函数 string1 2; // 这样也是不行的, 因为取消了隐式转换 string2 3; // 这样也是不行的, 因为取消了隐式转换 string3 string1; // 这样也是不行的, 因为取消了隐式转换, 除非类实现操作符的重载 总结 explicit关键字只需用于类内的单参数构造函数前面。由于无参数的构造函数和多参数的构造函数总是显示调用这种情况在构造函数前加explicit无意义。 google的c规范中提到explicit的优点是可以避免不合时宜的类型变换缺点无。所以google约定所有单参数的构造函数都必须是显示的只有极少数情况下拷贝构造函数可以不声明称explicit例如作为其他类的透明包装器的类。 effective c中说被声明为explicit的构造函数通常比其non-explicit兄弟更受欢迎。因为它们禁止编译器执行非预期往往也不被期望的类型转换。除非我有一个好理由允许构造函数被用于隐式类型转换否则我会把它声明为explicit鼓励大家遵循相同的政策。
http://www.w-s-a.com/news/534310/

相关文章:

  • 创意品牌网站云服务
  • 个人备案网站可以做商城展示如何制作网页二维码
  • 网站建设php教程视频百度seo 站长工具
  • 外包小程序两个相同的网站对做优化有帮助
  • 网站备案主体修改wordpress 导航图片
  • 怎么建设网站数据库用vs代码做网站
  • 运营企业网站怎么赚钱动漫制作专业概念
  • 宜春网站建设推广网络推广工作好干吗
  • 网站程序0day平顶山市做网站
  • 企业网站名称怎么写哔哩哔哩网页版官网在线观看
  • 直播网站建设书籍阿里巴巴网站建设销售
  • 肇庆企业自助建站系统郴州网站建设解决方案
  • 长沙专业做网站排名游戏开发大亨内购破解版
  • 网站推广适合女生做吗网站如何开启gzip压缩
  • 做外单阿里的网站建站平台那个好
  • 全国性质的网站开发公司关于网站开发的请示
  • 齐齐哈尔住房和城乡建设局网站生物科技公司网站模板
  • 中国建设协会官方网站前端培训的机构
  • 网站建设套餐是什么北京孤儿院做义工网站
  • 网站如何做微信支付链接做暧小视频xo免费网站
  • SEO案例网站建设重庆建站模板平台
  • 上海seo网站推广公司wordpress 小米商城主题
  • 搭建服务器做网站什么网站可以请人做软件
  • 上海建筑建材业网站迁移公家网站模板
  • 仿制别人的网站违法吗网站防火墙怎么做
  • 杨浦网站建设 网站外包公司如何进行网络推广
  • wordpress+仿站步骤超详细wordpress常用函数
  • 浙江手机版建站系统哪个好怎样黑进别人的网站
  • 企业网站搜索引擎推广方法装修网络公司
  • 网站运营优化建议wordpress 添加媒体