首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++】C++入门知识详解(下)

这样C++函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域出现同名函数的。...3.引用 3.1 引用的概念、定义及特征 引用不是新定义一个变量,而是给已存在的变量起个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。符号为&。...double d = 3.14; int i = d; 上面这个d并不是直接赋值给i,d和i类型不同,这里叫隐式类型转换,隐式类型转换中间会产生临时对象存储。...• 语法概念上引用是一个变量的取别名不开空间,指针是存储一个要量地址,要开空间。 • 引用在定义时必须初始化,指针建议初始化,但是语法上不是必须的。...使用nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,而不能被转换为整数类型。 简而言之,就是在C++中的空指针变成了nullptr,不是NULL。

9410

【C++篇】深度解析类与对象(下)

成员变量在类中声明时没有缺省值: 对于内置类型成员,初始化为随机值,可能是默认值 0 等,具体行为依赖于编译器。...二、类型转换 2.1 C++ 中的类型转换概述 在C++中,类型转换是一个非常强大的功能。它允许我们在不同类型之间进行转换。在类中,类型转换通常通过构造函数或者类型转换运算符来实现。...C++支持隐式和显式类型转换,这在开发复杂系统时非常有用。 2.2 隐式类型转换 如果一个类有一个接受单个参数的构造函数,那么该类的对象可以通过传递该类型的参数进行隐式构造。...这个过程称为隐式类型转换。然而,隐式类型转换可能会导致意外的行为,因此我们通常希望控制这种行为。...2.3 使用explicit关键字阻止隐式类型转换 为了避免隐式类型转换导致的错误,我们可以使用explicit关键字来标记构造函数,这样该构造函数将不再允许隐式转换。

11710
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Scala之隐式转换「建议收藏」

    概述 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型。...隐式类与旧的隐式转换的语法(implicit def)是有细微的不同的,隐式类的运作方式是:隐式类的主构造函数只能有一个参数(有两个以上并不会报错,但是这个隐式类永远不会被编译器作为隐式类在隐式转化中使用...从语义上这很自然:这个隐式转换类将包裹目标类型,隐式类的所有方法都会自动“附加”到目标类型上。 应用场景 转换成预期类型 对于这种使用场景实际上并不多见,实际意义也没有那么大。...因此当使用 1 -> “One”时,编译器自动插入从 1 转换到 ArrowAsso c转换。 类型类 类型类是一种非常灵活的设计模式,可以把类型的定义和行为进行分离,让扩展类行为变得非常方便。...隐含参数有点类似缺省参数,如果在调用方法时没有提供某个参数,编译器会在当前作用域查找是否有符合条件的 implicit 对象可以作为参数传入,不同于缺省参数,隐式参数的值可以在方法调用的前的上下文中指定

    81750

    Effective C++笔记

    const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体 编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性” 当const和non-const...你应该在你的所有接口中努力达成在这些性质 “促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容 “阻止误用”的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任 tr1...了解隐式接口和编译器多态 class和templates都支持接口和多态 对classes而言接口是显示的,以函数签名为中心,多态则是通过virtual函数发生于运行期 对template参数而言,接口是隐式的...需要类型转换时请为模板定义非成员函数 当我们编写一个class template,而它所提供的“与此template相关的”函数支持“所有参数的隐式类型转换”时,请将那些函数定义为“class template...它们以templates和“templates特化”完成实现 整合重载技术后,traits classes有可能在编译器对类型执行if...else测试 48.

    82220

    C++类和对象(4)

    ;实质上初始化列表就是我们的默认构造函数的一部分; 2.单参数里面的隐式类型转换 (1)什么是隐式类型转换,简单的讲,就是把不能类型的变量之间可以相互的赋值但是不会报错,我们通过下面这个简单的例子了解一下...: 这个就是隐式类型转换的常见的例子,本来c是int类型的数据,但是他可以接受a这个double类型的数据的赋值,这个过程就发生了隐式类型的转换; 具体原理如下(这个后面的类和对象的隐式类型转换用的也是这个原理...优化之后省去了拷贝的过程和临时变量的创建,直接执行的就是构造函数,我们透过这个打印结果是可以看出来的: (4)对于这个隐式类型转换,我们是可以避免的,就是我们可以使用一些手段不允许编译器进行上面的隐式类型转换...,就是在构造函数前面加上explicit关键字,就可以让编译器无法进行隐式类型转换,加上这个关键字的后果就是我们的不同类型数据之间的赋值就会报错(实际上我们一般不会这样做)。...3.多参数的隐式类型转换 (1)上面介绍的是单参数的隐式类型转换,下面我们看一下多个参数的,唯一的不同就是我们这里使用了大括号,其他的原理都是相同的,这里同样是进行了优化的操作 (2)C++11支持多参数的隐式类型转换

    3700

    【C++】基础:Effective C++高效编程建议

    了解 C++ 为你偷偷地加上和调用了什么函数 编译器可以隐式生成一个 class(类)的 default constructor(缺省构造函数),copy constructor(拷贝构造函数),copy...在资源管理类中准备访问裸资源(raw resources) API 经常需要访问裸资源,所以每一个 RAII 类都应该提供取得它所管理的资源的方法。 访问可以通过显式转换或者隐式转换进行。...通常,显式转换更安全,而隐式转换对客户来说更方便。 16. 使用相同形式的 new 和 delete 如果在 new 表达式中使用了 [],就必须在对应的 delete 表达式中使用 []。 17....使接口易于正确使用,而难以错误使用 好的接口易于正确使用,而难以错误使用。你应该在你的所有接口中为这个特性努力。 使易于正确使用的方法包括在接口和行为兼容性上与内建类型保持一致。...为类型信息使用 traits classes(特征类) 48.

    22110

    Effective C++: 改善程序与设计的55个具体做法

    ■ 编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”(conceptual constness)。...■ 对原始资源的访问可能经由显式转换或隐式转换。一般而言显式转换比较安全,但隐式转换对客户比较方便。...条款46:需要类型转换时请为模板定义非成员函数 请记住 ■ 当我们编写一个class template,而它所提供之“与此template相关的”函数支持“所有参数之隐式类型转换”时,请将那些函数定义为...■ 整合重载技术(overloading)后,traits classes 有可能在编译期对类型执行if...else测试。...■ 不要过度倚赖编译器的报警能力,因为不同的编译器对待事情的态度并不相同。一旦移植到另一个编译器上,你原本倚赖的警告信息有可能消失。

    72020

    C++奇迹之旅:初始化列表与explicit

    再谈构造函数 构造函数体赋值 初始化列表 初始化列表效率 隐式类型转换 复制初始化 单多参数构造函数 explicit关键字 总结 再谈构造函数 构造函数体赋值 在创建对象时,编译器通过调用构造函数...总结一下就是: 初始化列表,不管你写不写,每个成员变量都会先走一遍 自定义类型的成员会调用默认构造(没有默认构造就编译错误) 内置类型有缺省值用缺省值,没有的话,不确定,要看编译器,有的编译器会报错...对于内部数据类型的数据成员而言,两种初始化方式的效率几乎没有区别, 隐式类型转换 看看小类A: class A { public: A(int a) :_a(a) { cout << "A(...A aa3 = 3; 在这个代码中,A aa3 = 3;能够直接赋值是因为发生了隐式类型转换。...在 A 类中,有一个接受 int 类型参数的构造函数 A(int a), 在 main() 函数中,A aa3 = 3; 是一个复制初始化的过程,编译器在执行复制初始化时,会尝试将右侧的 3 隐式转换为

    8010

    【笔记】《Effective C++》条款26-55

    : 所有基类可以使用的地方, D也可以派上用场, 尽管具体行为可能有所不同 不同的行为应该用虚函数来实现, 这非常重要 应该尽可能阻断那些派生类与基类的不同的接口, 运行期的方法是在派生类的对应函数中用...这也是前面 条款7 和 条款34 的一种解释 37 绝不重新定义继承而来的缺省参数值 虚函数是动态绑定的, 但是函数的缺省参数值却是静态绑定的, 只与你填写这个缺省参数值时的类型有关, 与指针指向的实际类型无关..., 在编译期才被具现化出来), 需要的是隐式接口(参数被传入模板后受到模板中的调用)和编译期多态(不同模板参数具象化出不同的模板导致了调用不同的接口), 很难把握 隐式接口并不基于函数签名式决定, 而是按照模板内的表达式决定..., 我们提前进行的设计需要尽量满足表达式的输入和返回的类型 不管是显式接口还是隐式接口, 都在编译期完成检查, 因此我们都要好好检查, 可能被传入模板的类型到底能不能满足模板的隐式接口 42 了解typename...T类型转为了U类型, 从而实现了模板类的隐式类型转换 这类的转换的接口形如下图: 46 需要类型转换的时候请为模板定义非成员函数 模板函数进行实参推导的过程中不会自动考虑模板函数的隐式类型转换, 因为从一开始编译器就看不见这个目标转换函数

    93330

    类和对象(下)

    : 如果某些成员变量没有显式在初始化列表中进行初始化,它们的初始化依赖于其声明类型: 类中声明位置有缺省值: 如果类内给成员变量提供了默认初始值,那么这些变量将使用该缺省值来初始化 class...} }; 类中声明位置没有缺省值: 对于内置类型(如 int、float 等),这些变量的初始值可能是随机的,也可能是 0 或其他默认值,这取决于编译器的行为。...类型转换 在C++中,类型转换(Type Casting)是一种将一个类型的数据转换为另一个类型的机制。这在许多情况下很有用,例如在需要不同精度的算术运算、函数参数传递、类之间的转换等情境下。 1....隐式类型转换 int a = 10; double b = a; // 隐式将 int 类型的 a 转换为 double 在上述例子中,编译器会自动将 int 类型的 a 转换为 double,以确保类型一致...1) static_cast 2) dynamic_cast 3) const_cast 4) reinterpret_cast 隐式转换和显式转换的对比: 隐式转换:自动发生,不需要程序员的干预

    7410

    C++ 类和对象

    } this 指针会因编译器不同而有不同的存储位置,可能是栈、寄存器或全局变量 类的默认成员函数 类有六个默认成员函数: 构造函数 析构函数...,使用传值方式编译器直接报错,因为在语法逻辑里面,传参是拷贝构造出一个函数,那么就会不断地拷贝构造,也就无穷递归调用,也就报错了 C++规定自定义类型进行拷贝行为必须先调用拷贝构造,使用这里自定义类型传参和传值返回都会调用拷贝构造函数完成...C++支持内置类型隐式转换为类类型对象,需要有相关内置类型的构造函数。...在构造函数前加explicit就不能隐式转换了 类类型对象之间也可以隐式转换,需要相应的构造函数支持。...2,2 };//对2,2整体隐式类型转换 B b = c; //他俩先拷贝构造成a隐式类型转换成a B e(1); B r = {1}; // const B& rb = c; return

    8410

    【C++初阶】类和对象(下)

    如果你没有给缺省值,对于没有显示在初始化列表初始化(没有在初始列表初始化说明也没有缺省值)的内置类型成员是否初始化取决于编译器,C++并没有规定;对于没有显式在初始化列表初始化的自定义类型成员会调用这个成员类型的默认构造函数...测试:这个代码的结果是什么(假设编译器不会对未显式初始化的内置类型进行初始化)?...隐式类型转换 C++支持内置类型隐式类型转换为类类型对象,但是需要有相关内置类型为参数的构造函数。 构造函数前面加explicit就可以不支持隐式类型转换。...类类型的对象之间也可以隐式转换,需要相应的构造函数支持。 C++11之后支持了多参数隐式类型转换,除了相应的构造函数支持之外,多参数需要用{}括住,用逗号隔开。...补充:在一些比较先进的编译器上,遇到连续构造+拷贝构造时会直接优化为直接构造,也就是说隐式类型转换的两步会直接优化为1步,我们可以通过在构造函数和拷贝构造中加入输出语句来观察。

    9910

    【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)

    // 实际编译器背后会用2023构造一个无名对象,最后用无名对象给d1对象进行赋值 d1 = 2023; } 二.相关知识补充:隐式类型转换 类型转换会产生临时变量 PS:构造函数不仅可以构造与初始化对象...),编译器会自动生成 1.构造函数 默认构造函数(3种):(1)类自己生成的函数(2)无参 (3)全缺省的函数 特征: (不传参就可以调用) 构造函数的主要任务是初始化对象,如果类中没有显式定义构造函数...3.拷贝构造函数 行为:在创建对象时,创建一个与已存在对象一模一样的新对象 拷贝构造函数: 只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰) 在用已存在的类类型对象创建新对象时由编译器自动调用...模板参数实例化分为:隐式实例化和显式实例化。实例化实现的任务是交给编译器的。...1.隐式实例化 引入:隐式实例化的机制是让编译器根据实参推演模板参数的实际类型,而这往往会出现一些问题 适用情况:其交换的两者是同一类 不适用情况:其交换的两者不是同一类 template<

    25310

    C到C++II

    }; i = 65; std::cout << c << std::endl; return 0; } //打印结果 A C++枚举 声明或定义枚举变量,可以省略enum 独立类型和整型不能隐式相互转换...//枚举类型检查更为严格 enum Color{ RED, GREEN, BLUE }; int main(){ Color color; //在C中枚举类型可以隐式转换成整型...0; } 详细的结构体----C语言之结构体 bool类型 true 表示真 即单字节整数1 false 表示假 即单子接整数0 任何基本类型都可以隐式转换为布尔类型,遵循原则:非0即真,0即假...提高效率,避免函数调用开销 使用inline关键字期望该函数被优化为内联,是否内联由编译器决定,看你系统的心情决定是否优化。 内联会使可执行文件内存变大,只有频繁调用的简单函数适合内联。...为函数指定缺省值,调用时若未指定实参,则对应的形参取缺省值 缺省参数只能在最后,即你某个参数指定为缺省参数,后面所有参数都要有缺省值 最好在函数声明中指定缺省参数,这样可以利用声明改缺省值。

    1.2K30

    初识C++ · 类和对象(下)

    ,系统会报错:没有默认的构造函数,因为我们显式调用了构造函数,也没有默认构造,我们没有给缺省值,参数也没有缺省值,调用的时候就会报错。...stack类也是初始化了的,那么这就意味着,初始化列表不管你写不写编译器都是要走一遍的,所以C++打的补丁缺省值,实际上给的是初始化列表。即便我初始化列表什么都不写,仍然会走一遍初始化列表。..._a; }; int main() { A a1(); A a2 = 2; return 0; } 我们创建对象的时候,可以用构造函数创建,也可以利用隐式类型转换创建,内置类型被转换为自定义类型,...,如果没有隐式类型转换,我就需要先创建一个,再插进去,这多麻烦,有了隐式类型转换直接就插入进去了。...但是有没有发现一个问题就是,隐式类型转换是内置类型给给自定义类型,如果是多个参数,又怎么办呢?

    7510

    类和对象:C++11新特性与知识补充

    : 声明时有缺省值:会在经历初始化列表的时候用缺省值进行定义 声明时没有缺省值: 内置类型:看编译器,大概率随机值 自定义类型:调用默认构造,无默认构造时候会报错 private...隐式类型转换 隐式类型转换(Implicit Conversion),又称自动类型转换,是指编译器自动将一种数据类型转换为另一种数据类型的过程。...内置类型隐式转换成类类型 C++ 支持将内置类型隐式转换为类类型对象,为了支持隐式类型转换,类需要提供一个接受单个参数的构造函数。...,特别是在隐式类型转换的情况下,编译器有时会创建一个临时对象作为中间变量。...编译器一般会对该过程进行优化,不会创建临时变量而是直接构造,但是也有必须创建临时变量的时候: A aa1 = 1; // 隐式类型转换:int -> A aa1.Print(); const A& aa2

    9810

    【c++】类和对象(六)深入了解隐式类型转换

    在类构造函数中,成员变量的行为类似于局部变量,如果不在初始化列表中显式初始化,它们将不会被自动初始化 _n是通过初始化列表初始化的,因为它是const类型的,必须在那里初始化。...C cc2 = 2; 这行代码演示了隐式类型转换。虽然看起来像是将整数2赋值给cc2,实际上C++编译器解释为使用2作为参数调用C类的构造函数来初始化cc2。...这是因为C(int x)构造函数允许从int到C的隐式转换。 复制初始化是C++中一种对象初始化的方式,它与直接初始化有所不同,但在某些情况下可以产生类似的效果。...这一步是隐式类型转换的一部分。 调用拷贝构造函数:编译器接下来会使用这个临时对象(如果第一步创建了临时对象的话)作为参数调用C的拷贝(或移动)构造函数,来初始化obj。...// 依赖于C(int)构造函数的隐式类型转换 这两种方式都是可行的,它们创建了一个C类型的临时对象,并将其绑定到const引用cc3上。

    45910

    看了这篇,我确定你已经彻底搞懂Java的继承了

    遇到认真的读者是作者的一种幸运,真的,上一篇接口推送后,有好几个读者留言说,“二哥,你有一处内容需要修正,应该是接口中不能有 private 和 protected 修饰的方法。”...这就是继承的好处:子接口拥有了父接口的方法,使得子接口具有了父接口相同的行为;同时,子接口还可以在此基础上自由发挥,添加属于自己的行为。 以上,把“接口”换成“类”,结论同样成立。...如果一个类在定义的时候没有使用 extends 关键字,那么它隐式地继承了 java.lang.Object 类——在我看来,这恐怕就是 Java 号称万物皆对象的真正原因了。...在子类 Wangxiaoer 中定义一个测试方法 testVariable(): ? 可以确认,除了私有的 privateName,其他三种类型的成员变量都可以继承到。...super(age, name); } } is-a 是继承的一个明显特征,就是说子类的对象引用类型可以是一个父类类型。

    38131

    C++的魔法世界:类和对象的终章

    二、类型转换 2.1隐式类型转换 造构造函数中不仅可以构造初始化对象,对于单个参数或者第一个参数无缺省值其余参数均有默认值的构造函数还具有类型转换的作用 class Date { public: Date...,这种逻辑很明显是错误的,但是Date类实现了,单个参数的构造函数,使得整形1在赋值给d1对象时,发生了隐式类型转换,将整形1转换为Date类型,从而进行赋值。...这是编译器在效率上的优化提升,不同版本编译器的优化效果和逻辑大不相同,类如DEVC++编译器可能就不会去进行优化。...注意:编译器生成的临时对象具有常性 如下图:前面提过,隐式类型转换实际上通过调用构造函数生成临时对象,而临时对象又去调用拷贝构造完成赋值的过程,这里的临时对象具有常性,下图的**普通d1对象尝试对一个具有常性的对象进行引用...return 0; } 2.3explicit关键字 当不期望,隐式类型转换的发生,可以在构造函数前添加关键字: ecplicit 它的功能:禁止使用隐式类型装换 、 2.4多参数构造 以上介绍的都是单参数的类型转换

    5000
    领券