zoukankan      html  css  js  c++  java
  • c++ explicit 用法摘抄

    笔记

    //Student.h
    [explicit修饰] Student (int n);

    Student doh("Homer" , 10); doh = 5;       //没有 explicit
    =>
    doh = Student(5);  
    doh = 5; 报错!    //有 explicit

    from C++ Primer Plus

    explicit Student (const std::string & s) : name(s) , scores() {}
    explicit Student (int n) : name("Nully") , scores(n) {}

    本书前面说过,可以用一个参数调用的构造函数将用作从参数类型到类类型的隐式转换函数;

    但这通常不是好主意。在上述第二个构造函数中,第一个参数表示数组的元素个数,而不是数

    组中的值,因此将一个构造函数用作int到Student的转换函数是没有意义的,所以使用explicit

    关闭隐式转换。如果省略该关键字,则可以编写如下所示的代码。

    Student doh("Homer" , 10);    //创建Homer名字的学生,并构造尺寸为10的分数数组
    doh = 5;                    //重置学生名称为Nully,重置尺寸为5的分数数组

    在这里,马虎的程序员检入了doh而不是doh[0] 。如果构造函数省略了explicit,则将使用

    构造函数调用Student(5)将5转换为一个临时Student对象,并使用Nully来设置成员name

    的值。因此赋值操作将使用临时对象替换原来的doh值。使用explicit后,编译器将认为上述

    赋值运算符是错误的。

    C++和约束

    C++包含让程序员能够限制程序结构的特性——使用explicit防止单参数构造函数的隐式转

    换,使用const限制方法修改数据,等等。这样做的根本原因是:在编译阶段出现错误优于

    在运行阶段出现错误。

  • 相关阅读:
    ffmpeg解码视频存为BMP文件
    iphoneOS与Windwos下RTSP服务器与客户端的搭建
    RTSP协议介绍
    还原数据库
    .NET导入Excel数据
    jquery对表单元素操作
    Jquery操作select
    The process cannot access the file '' because it is being used by another process.....
    aspnet_merge.exe”已退出,代码为1的错误
    vs2008运行正常(可以访问数据库),而iis不能正常访问数据库
  • 原文地址:https://www.cnblogs.com/Again/p/6039347.html
Copyright © 2011-2022 走看看