首页
学习
活动
专区
圈层
工具
发布

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

deque, 只是依据在deque上而已) 39 明智而审慎地使用private继承 由于访问限制的原因, 编译器无法自动将private继承的派生类转型为基类, 且派生类无法使用基类的成员 因此private...这个规矩也就是Java等语言中对接口这种多重继承性质的类有特殊设计的原因 当用到这种虚基类作为接口时, 一般都采用公有继承, 因为其没有实际变量, 那么各种接口函数都应该是设计给用户使用的 7 模板与泛型编程..., 因此我们无法直接在模板类中调用模板化的基类的成员 有三种方法处理这个问题: 在调用基类函数前加上this指针this->foo();, 用指针进行多态调用 用using声明式using Base成员函数模板接受所有兼容类型 模板之间并没有什么类似继承关系的固有关系, 无法自动在继承类之间进行隐式转换, 智能指针类通过底层的转型来模拟这种关系 方法是编写用于指针间类型转换的构造模板,...称为成员函数模板(member function template) 智能指针类编写了非explicit的构造函数, 在自身底层是T类型的指针时, 接受一个U类型的指针作为构造函数的参数, 然后通过原始指针本身的转换和继承形式将

1.2K30

C++复习知识点(仅供参考)

函数重载:用同一个函数名定义不同的函数,当函 数名和不同的参数搭配时函数的含义不同。 封装,可以达到,对内开放数据,对外屏蔽数据,对外提供接口。...它是定义在类外的普通函 数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元 的名称前加上 关键字 friend 运算符重载 左操作数该函数的调用对象   右操作数该函数的参数对象 类型兼容性原则...C++语言中函数的返回值类型的是由在定义该函数时所指定的数据类型决定的成员函数拥有this指针 面向对象程序设计的特征:封装,继承、派生,多态性 当成员函数体在写类的声明内且无循环语句与switch 语句是为内联函数...19.模板与类参数: 在面向对象程序设计中,函数模板有两种常见的应用方式: 1>函数模板作为类模板的成员函数,在模板类型参数中重载函数与运算符,直接访问私有数据成员,实现通用算法。...b.只有类的成员函数才能说明为虚函数,这是因为虚函数仅适用于有继承关系的类对象。 c.静态成员函数和内联函数,不能作为虚函数。

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

    C++心决之类和对象详解(上篇)(封装入门篇)

    【访问限定符说明】 1. public修饰的成员在类外可以直接被访问 2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的) 3...】 问题: C++ 中 struct 和 class 的区别是什么?...注意:在继承和模板参数列表位置,struct和class也有区别 4.2 封装 【面试题】 面向对象的三大特性: 封装、继承、多态 。...C++ 中通过引入 this 指针解决该问题,即: C++ 编译器给每个 “ 非静态的成员函数 “ 增加了一个隐藏 的指针参数,让该指针指向当前对象 ( 函数运行时调用该函数的对象 ) ,在函数体中所有...只能在“成员函数”的内部使用 3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针。

    25810

    【C++进阶】多态的理解

    一.多态是什么 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。 对于多态,不同的对象传过去,会调用不同的函数; 即多态调用看的是指向的对象。...,例如:函数重载和模板;         2.动态绑定,也称为动态多态,是在程序运行阶段确定的,根据具体拿到的类型确定程序的               具体行为,调用具体的函数。...接口继承和实现继承 实现继承:普通函数的继承是一种实现继承; 接口继承:虚函数的继承是一种接口继承,如果不实现多态,不要把函数定义成虚函数。...虚函数与静态成员函数 静态成员函数没有this指针,使用类型::成员函数的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表,即静态成员函数不能设置成虚函数。...结论 析构函数建议设置成虚函数,因为有时可能利用多态方式通过基类指针调用子类析构函        数,尤其是父类的析构函数强力建议设置为虚函数,这样动态释放父类指针所指的子类      对象时,能够达到析构的多态

    29310

    《逆袭进大厂》第三弹之C++提高篇79问79答

    HelloWorld 124、模板类和模板函数的区别是什么?...函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定。即函数模板允许隐式调用和显式调用而类模板只能显示调用。...,下标运算符通常以所访问元素的引用作为返回值,同时最好定义下标运算符的常量版本和非常量版本; 7、 箭头运算符必须是类的成员,解引用通常也是类的成员;重载的箭头运算符必须返回类的指针; 129、当程序中有函数重载时...所以为了容易使用,几乎总是在头文件中放置全部的模板声明和定义。 140、在成员函数中调用delete this会出现什么问题?对象还可以使用吗?...1、在类对象的内存空间中,只有数据成员和虚函数表指针,并不包含代码内容,类的成员函数单独放在代码段中。在调用成员函数时,隐含传递一个this指针,让成员函数知道当前是哪个对象在调用它。

    2.9K30

    我的大厂面试经历(附100+面试题干货)

    Dynamic_cast:针对基类和派生类指针和引用转换,基类和派生类之间必须要继承关系,是安全的    Reinterpret_cast:允许将任何指针类型转为其他指针类型,是安全的  8:Malloc...实现:需要注意申请失败,如果相应的处理函数则调用,否则抛出bad_alloc异常  40:如何得到一个结构体内成员的偏移量? 41:进程与线程的区别?  ...不可以为虚函数,因为在调用构造函数时,虚表指针并没有在对象的内存空间中,必须要构造函数调用完成后才会形成虚表指针。    拷贝构造函数是构造函数所以理由同上。  44:析构函数能不能虚函数?...原因:多文件处理变为一个文件其实是通过链接器来实现的,所以如果用源文件来处理模板实现,会导致链接失效,最主要的原因还是在编译,编译器会暂时不处理模板类只有在实例化对象时才去处理,但是这就需要实现的代码了...对于有虚函数和虚表存在的类,在进行memset后不能调用虚函数和虚基表继承而来的数据和函数  50:对一个数组而言,delete a和delete[] a有什么区别?为什么?

    1.5K20

    知识总结:C++工程师106道面试题总结(含答案详解)

    Dynamic_cast:针对基类和派生类指针和引用转换,基类和派生类之间必须要继承关系,是安全的    Reinterpret_cast:允许将任何指针类型转为其他指针类型,是安全的  Malloc...实现:需要注意申请失败,如果相应的处理函数则调用,否则抛出bad_alloc异常  如何得到一个结构体内成员的偏移量? ? 进程与线程的区别?  ...不可以为虚函数,因为在调用构造函数时,虚表指针并没有在对象的内存空间中,必须要构造函数调用完成后才会形成虚表指针。    拷贝构造函数是构造函数所以理由同上。  析构函数能不能虚函数?...原因:多文件处理变为一个文件其实是通过链接器来实现的,所以如果用源文件来处理模板实现,会导致链接失效,最主要的原因还是在编译,编译器会暂时不处理模板类只有在实例化对象时才去处理,但是这就需要实现的代码了...对于有虚函数和虚表存在的类,在进行memset后不能调用虚函数和虚基表继承而来的数据和函数  对一个数组而言,delete a和delete[] a有什么区别?为什么?

    3.3K90

    C++ 类使用规范建议

    缺点:在构造函数中执行操作引起的问题有: (1) 构造函数中不易报告错误,尽量不要使用异常,原因是因为在构造函数中抛出异常,在概念上将被视为该对象没有被成功构造,因此当前对象的析构函数就不会被调用,那么就容易造成内存泄露...在将类作为STL容器值得时候,你可能有使类可拷贝的冲动。类似情况下,真正该做的是使用指针指向STL容器中的对象,可以考虑使用std::tr1::shared_ptr。...使用继承的相关规范: (1)所有继承尽量使用public的,如果想私有继承的话,应该采取包含基类实例作为成员的方式作为替代。 (2)不要过多使用实现继承,组合通常更合适一些。...(3)基类如果有虚函数函数,那么令析构函数为virtual。原因是保证通过基类指针能够动态的调用子类析构函数,避免内存泄露。...定义:多重继承允许子类拥有多个基类,要将作为纯接口的基类和具有实现的基类区别开来。 优点:相比单继承,多重实现继承可令你重用更多代码。

    2K20

    面试常考知识点总结——面试必看

    在模板内的static函数只可被这一模块内的其他函数调用,这个函数的适用范围被限制在声明他的模板内 在类中static成员变量属于整个类所拥有,对象的所有对象只有一份复制 在类中static成员函数属于整个类所拥有...,这个函数不接收this指针,因而只能访问类的static成员变量 引用和指针有什么区别?...平衡树(BT) 指的是,任意节点的子树的高度差都小于等于1。 堆栈溢出一般是什么原因导致的? 函数调用层次太深。...普通函数:普通函数不属于成员函数,是不能被继承的。普通函数只能被重载,不能被重写,因此声明为虚函数没有意义。 友元函数:友元函数不属于类的成员函数,不能被继承。...内联成员函数:内联函数是在编译时展开的,而虚函数是为了实现多态,是在运行时绑定的。因此内联函数和多态的特性相违背。 静态成员函数:首先静态成员函数理论是可继承的。

    99220

    【C++】侯捷C++面向对象高级编程(下)

    ---- 成员模板(member template) 也就是模板的嵌套,模板中有模板。 如下图黄色部分。 说明: 黄色这一块是当前模板的一个成员,同时它自己也是个模板。...所以它就叫做成员模板。 T1,T2可以变化,U1,U2也可以变化。 在STL标准库中会大量出现成员模板,先来一个小示例: 解释: 鲫鱼类继承自鱼类,麻雀类继承自鸟类。...调用指针->向上转型(转为具体的子类)->调用虚函数 补充: 继承父类,函数,继承的是调用权。 父类的虚函数子类也一定要有。 父类和子类中可以出现同名的函数,但实际上不是同一个。...---- this pointer 类的成员函数中,默认会有一个this指针传递进来。由编译器自己处理。...常量对象不能调用非常量成员函数,反之,可以。 但是,当成员函数的const版本和非const版本都存在,则常量对象只能调用const版本,非const对象只能调用非const版本。

    90020

    Google C++编程风格指南(四)之类的相关规范

    在将类作为STL容器值得时候,你可能有使类可拷贝的冲动。类似情况下,真正该做的是使用指针指向STL容器中的对象,可以考虑使用std::tr1::shared_ptr。...使用继承的相关规范: (1)所有继承尽量使用public的,如果想私有继承的话,应该采取包含基类实例作为成员的方式作为替代。 (2)不要过多使用实现继承,组合通常更合适一些。...(3)基类如果有虚函数函数,那么令析构函数为virtual。原因是保证通过基类指针能够动态的调用子类析构函数,避免内存泄露。...定义:多重继承允许子类拥有多个基类,要将作为纯接口的基类和具有实现的基类区别开来。 优点:相比单继承,多重实现继承可令你重用更多代码。...尤其是不要仅仅为了在STL容器中作为key使用就重载operator==或operator的时候,创建相等判断和大小比较的仿函数类型。

    1.1K21

    程序员应该掌握的600个英语单词

    )运算子调用操作符  (同 function call operator)  candidate function 候选函式 候选函数  (在函式多载决议程序中出现的候选函式)  chain 串链(例...功能  function template 函式模板、函式范本 函数模板  functor 仿函式 仿函式、函子  game 游戏 游戏  generate 生成  generic 泛型、一般化的 一般化的...功能  function template 函式模板、函式范本 函数模板  functor 仿函式 仿函式、函子  game 游戏 游戏  generate 生成  generic 泛型、一般化的 一般化的...机制 机制  member 成员 成员  member access operator 成员取用运算子(有 dot 和 arrow 两种) 成员存取操作符  member function 成员函式...C++ Primer 3/e, 15.8.2  platform 平台 平台  pointer 指标 指针  址位器(和址叁器 reference 形成对映,满好)  poll 轮询 轮询  polymorphism

    1.7K00

    深入理解面向对象编程特性 : 继承

    原因在于protected或private继承的成员只能在子类内部使用,限制了代码的扩展性和可维护性。...但是由于foo()是依赖于模板参数T的成员函数,编译器无法确定foo()是从基类继承的。这是因为模板是按需实例化的,编译器在第一次查找时并不知道派生类实例化时会包含哪些基类成员。...在使用Derived d;初始化的时候会对构造函数进行实例化并调用构造函数,但是当使用d.bar();时,如果在bar()中为foo();即会编译错误,原因就如上述,无法确定从基类继承。...此时的A和B类构成的是隐藏的关系。 编译运⾏结果是什么? 编译报错。(b.fun(); ) ⼦类的默认成员函数 子类的构造函数 子类的构造函数必须调用父类的构造函数来初始化父类的那部分成员。...原因是友元关系不继承:Display函数虽然是Person的友元,但它不是Student的友元,所以不能访问Student的保护成员。

    43810

    程序员必须掌握的600个英语单词

    )运算子调用操作符 (同 function call operator) candidate function 候选函式 候选函数 (在函式多载决议程序中出现的候选函式) chain 串链(例...功能 function template 函式模板、函式范本 函数模板 functor 仿函式 仿函式、函子 game 游戏 游戏 generate 生成 generic 泛型、一般化的 一般化的...功能 function template 函式模板、函式范本 函数模板 functor 仿函式 仿函式、函子 game 游戏 游戏 generate 生成 generic 泛型、一般化的 一般化的...机制 机制 member 成员 成员 member access operator 成员取用运算子(有 dot 和 arrow 两种) 成员存取操作符 member function 成员函式...C++ Primer 3/e, 15.8.2 platform 平台 平台 pointer 指标 指针 址位器(和址叁器 reference 形成对映,满好) poll 轮询 轮询 polymorphism

    1.6K20

    《Effective C++》学习笔记

    继承体系(注意虚函数) 支持的类型转换(显示转换、类型转换操作符) 成员函数和成员变量的可见范围(public/protected/private) 是否用模板就能实现?...用tr1::function成员变量替换虚函数,从而允许包括函数指针在内的任何可调用物搭配一个兼容于需求的签名式。 将虚函数也做成另一个继承体系类,然后在调用其的类中添加一个指针来指向其对象。...条款36:绝不重新定义继承而来的非虚函数 不要重新定义继承而来的非虚函数,理论上,非虚函数的意义就在于父类和子类在该函数上保持一致的实现。...如果是 is-a 的关系,可以用继承,但如果是 has-a 的关系,应该将一个类作为另一个类的成员变量来使用,以利用该类的能力,而不是去以继承它的方式使用。...条款45:运用成员函数模板接受所有兼容类型 真实指针允许父类指针指向子类对象,如果想要让自制的智能指针也支持这种对象转换,那就需要特殊操作,因为一般的模板类(智能指针能指向多种对象,必然是模板类)只能以自身模板声明的类型来构造

    1.4K20

    深入解析【C++多态】:探索面向对象编程中的动态绑定与行为多样性和多态的核心概念与应用实践

    编译时 多态(静态多态)主要就是我们前⾯讲的函数重载和函数模板,他们传不同类型的参数就可以调⽤不同的 函数,通过参数不同达到多种形态,之所以叫编译时多态,是因为他们实参传给形参的参数匹配是在 编译时完成的...派生类不加virtual关键字,虽然也可以构成重写(因为继承 后基类的虚函数被继承下来了在派⽣类依旧保持虚函数属性)。 运行结果: 必须指针或者引⽤调⽤虚函数 。 被调⽤的函数必须是虚函数。...派⽣类由两部分构成,继承下来的基类和⾃⼰的成员,⼀般情况下,继承下来的基类中有虚函数表 指针,⾃⼰就不会再⽣成虚函数表指针。...但是要注意的这⾥继承下来的基类部分虚函数表指针和基 类对象的虚函数表指针不是同⼀个,就像基类对象的成员和派⽣类对象中的基类对象成员也独⽴ 的。...派⽣类中重写的基类的虚函数,派⽣类的虚函数表中对应的虚函数就会被覆盖成派⽣类重写的虚函 数地址。 func1和func2被继承下来了,派生类⾃⼰就不会再⽣成虚函数表指针,所以它们是同一个地址。

    34500

    【学习C++篇】 继承

    1.继承的概念及定义 1.1继承的概念 继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段,它允许我们在保持原有类特性的基础上进⾏扩展,增加⽅法(成员函数)和属性(成员变量...当然他们也有⼀些不同的成员变量和函数,⽐如⽼师独有成员变量是职称,学⽣的独有成员变量是学号;学⽣的独有成员函数是学习,⽼师的独有成员函数是授课。...(因为翻译的原因,所以既叫基类/派⽣类,也叫⽗类/⼦类) 1.2.2 继承基类成员访问⽅式的变化 总之,就是取权限最小的那个。...1.3 继承类模板 2. 基类和派⽣类间的转换 1. public继承的派⽣类对象 可以赋值给 基类的指针 / 基类的引⽤。这⾥有个形象的说法叫切⽚或者切割。...(在派⽣类成员函数中,可以使⽤ 基类::基类成员 显⽰访问) 3. 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。 4. 注意在实际中在继承体系⾥⾯最好不要定义同名的成员。

    18910

    UE4的智能指针 TSharedPtr

    ,内存管理,虚函数的使用等),就只占2倍(16字节)普通指针内存,更符合UE4的命名规范,内部实现是不抛异常的,不依赖任何第三方库,更容易调试等原因,那么下面就来看怎么实现的。...为了解释这个原因,先看看DestroyObject里面做了什么: 可以看到,调用了模板传入参数的DeleterType,并把Object作为参数传了进去。这个Deleter到底是什么呢?...这个CustomDeleter就是在智能指针其中一个构造函数上指定的。 这样,智能指针除了支持管理本身C++对象,用完自动delete这样的对象,还可以支持一些不是通过delete来释放的对象。...为什么要特意搞一个这样的类呢?可以想象一下,如果一个对象被外部的某个TSharedPtr管理,在自己的成员函数内,怎样获取外部的这个智能指针呢?...这是因为并不是所有用智能指针的类都继承了TSharedFromThis,为了保证只有继承的类生效,通过中转一层可以用模板的多态区分开。

    3.2K20

    【C++】面向对象编程:继承与多态的魅力

    继承 假设我们设计了两个类student和teacher,两个类中都有姓名、地址、年龄和电话,在没学继承概念时,我们需要将这些属性设计到两个类中,这会使得程序很冗余,但学了继承后,只需要将这些属性设计在一个...//因为这是一个模板,Container是模板参数,编译器不知道Container是什么类型,它可能是一个内嵌类型,也可能是一个静态成员变量,因此,我们需要在前面加上一个typename告诉编译器Container...需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。 注意:实际中在继承体系⾥⾯最好不要定义同名的成员。...存在数据冗余和二义性,在Assistant的对象中Person成员会有两份。⽀持多继承就 ⼀定会有菱形继承。...虚函数和普通函数⼀样的,编译好后是⼀段指令,都是存在代码段的,只是虚函 数的地址⼜存到了虚表中。 f.虚函数表本质是⼀个存虚函数指针的指针数组,⼀般情况这个数组最后面放了⼀个0x00000000标记。

    18410

    【C++航海王:追寻罗杰的编程之路】类与对象你学会了吗?(上)

    在主函数中按照顺序调用这些函数来完成整个做饭过程。在这种方式下,我们需要手动管理各个步骤之间的数据传递和调用顺序。...注意:在继承和模板参数列表位置,struct和class也有区别。 4.2 -> 封装 面向对象的三大特性:封装、继承、多态。 在类和对象阶段,主要是研究类的封装特性,那么什么是封装呢?...: Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函 数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?...C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏 的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”...8.2 -> this指针的特性 this指针的类型:类类型* const,即成员函数中,不能给this指针赋值; 只能在“成员函数”的内部使用; this指针本质上是“成员函数”的形参,当对象调用成员函数时

    16110
    领券