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

类和对象(下)

成员变量走初始化列表的逻辑: 显式在初始化列表中初始化的成员变量: 如果你在构造函数的初始化列表中明确地为成员变量指定了初始值,那么这些成员变量将按照提供的值进行初始化。...class MyClass { public: int x; MyClass(int a) : x(a) { // x 显式在初始化列表中被初始化为 a } }; 未显式在初始化列表中的成员变量...: 如果某些成员变量没有显式在初始化列表中进行初始化,它们的初始化依赖于其声明类型: 类中声明位置有缺省值: 如果类内给成员变量提供了默认初始值,那么这些变量将使用该缺省值来初始化 class...} }; 总结: 显式初始化列表:在初始化列表中明确初始化的成员将按指定的值进行初始化。...RVO(返回值优化):C++ 编译器可以通过优化,避免拷贝和构造不必要的临时对象。例如,在函数返回匿名对象时,编译器可能直接将返回值“构造”在目标位置,而不创建中间对象。

7410

《Effective C++》读书摘要

《Effective C++》读书摘要 最近刚读完侯捷的《Effective C++》,相对来说,这本书的内容比较贴近基础,对于刚掌握C++基础的人会有不少的提高。...三、const const返回值:避免(a*b)=c的错误; const参数:传递指向常量的引用; const成员函数:允许const属性的重载。 四、对象使用前初始化 构造函数成员初始化列表; ?...三十、inline里里外外 隐式:累内直接定义成(友)员函数,显式:inline关键字; 拒绝:复杂、虚函数、函数指针调用、模板、构造析构函数、影响动态连接或升级、对调试器的挑战(禁用)。...(六)、继承与面向对象设计 三十二、确定public继承塑膜出is-a关系 适用于基类的事情也适用于子类。 三十三、避免遮掩继承来的名称 基类的重载函数一旦在子类被重写后,其他的同名函数无法访问。...四十二、typename双重含义 模板声明中与class没有任何区别; 嵌套从属类型的显式指定,不能出现在基类列表和初始化列表中; ?

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

    Effective c++ 小结

    3,基本类型的non-const, non-reference对象,初始化和赋值之间没有2所说的区别 条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同 编译器构造和析构的顺序是相反的...,编译器不可能针对初始化列表中的顺序进行初始化,否则重载不同初始化顺序的构造函数会让编译器头晕的。...编译器内部确定是按照class内的声明次序,如果初始化列表不同,很可能初始化列表的数据会错误。 核心:先按class内声明成员默认赋值,然后调用初始化参数列表进行初始化。...,程序员应该显式的说明采用哪种方式。...如果类D私有继承于类B,类型D的对象只不过是用类型B的对象来实现而已;类型B和类型D的对象之间不存在概念上的关系 如果是私有继承,编译器不会隐式的将子类对象转化成基类对象 私有继承,基类所有函数在子类都变成私有属性

    81050

    CC++编码规范

    )的区别 关于继承接口和继承实现 限制继承的层数 继承树上非叶子节点的类应是虚基类 显式提供继承和访问修饰:public、protected 或private...显式指出继承的虚函数 基类析构函数(destructor)首选是虚函数 绝不要重新定义(继承来的)非虚函数 绝不要重新定义缺省参数值 ...不要将基类强制转换成派生类 关于C++中的分支用法选择 慎用多重继承 所有多重继承的基类析构函数都应是虚函数 2.9内存分配和释放 用new、delete...透彻研究编译器 2.13初始化和清除 声明后就初始化强于使用前才初始化 初始化要彻底 确保每一个构造函数都实现完全的初始化 尽量使用初始化列表...确保全局变量在使用前被初始化 2.14重载 仔细区分带缺省值参数的函数和重载函数 确保重载函数的所有版本有共同的目的和相似的行为 避免重载在指针和整型类型上

    2K20

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

    引言 在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。...这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。 一、类的默认成员函数 在C++中,编译器会为每个类自动生成一些成员函数,即使你没有显式地编写这些函数。...通常情况下,一个类在没有显式定义某些函数时,编译器会为其自动生成六个默认成员函数(需要注意的是这6个中最重要的是前4个,最后两个取地址重载不重要,我们稍微了解⼀下即可): 1.默认构造函数: 当没有显式编写构造函数时...6.显式定义的析构函数: 自定义类型成员的析构函数总会自动调用,无论析构函数是自动生成还是显式定义。 如果类没有动态资源管理需求,可以使用编译器生成的默认析构函数。...3.调用场合:拷贝构造在传值传参和传值返回时都会被调用。 4.默认生成:如果没有显式定义,编译器会生成默认的拷贝构造,对内置类型执行浅拷贝,对自定义类型调用其拷贝构造。

    12410

    【C++篇】继承之韵:解构编程奥义,感悟面向对象的至高法则

    为了访问基类的 _num,我们使用了 Person::_num 来显式地指定访问基类中的成员。这样可以避免由于成员同名而导致的混淆。 注意在实际中在继承体系里面最好不要定义同名的成员。...在派生类中,如果我们希望访问基类中的同名函数,必须显式调用基类的函数。...如果我们希望调用基类的 fun() 函数,必须通过 b.A::fun() 来显式调用。这与函数重载不同,函数隐藏仅要求函数名相同,而不考虑参数列表。...并且函数重载说的是同一作用域,而这里基类和派生类时两个作用域 3.2 派生类的默认成员函数 在 C++ 中,当我们不显式定义类的构造函数、拷贝构造函数、赋值运算符和析构函数时,编译器会自动为我们生成这些函数...3.2.1 构造函数的调用顺序 在派生类对象的构造过程中,基类的构造函数会优先于派生类的构造函数被调用。如果基类没有默认构造函数,则派生类的构造函数必须在初始化列表中显式调用基类的构造函数。

    11510

    C++一分钟之-继承与多态概念

    本文将深入浅出地探讨继承与多态的概念、常见问题、易错点以及如何有效避免这些错误,并通过具体代码示例加以说明。...常见问题与易错点访问权限:派生类可能无法访问基类中的私有成员,导致误解。记住,只有公有和保护成员才能被继承。构造函数与析构函数:基类的构造函数和析构函数不会自动被调用,需要显式调用或使用初始化列表。...在派生类构造函数中,使用初始化列表显式调用基类的构造函数。多重继承时考虑菱形问题,适时使用virtual关键字。...在C++中,主要通过虚函数实现多态,使得派生类可以根据自身情况重写基类中的虚函数。...如何避免确保需要被重写的函数声明为虚函数。使用引用或指针处理基类和派生类的关系,避免切片问题。在调用虚函数前检查指针是否为空。

    13510

    七、构造函数与析构函数

    调用机制 构造与析构函数的调用机制在C++中遵循一定的规则,这些规则确保了对象在创建和销毁时的正确初始化与清理。...调用顺序: 在创建派生类对象时,首先调用基类的构造函数,然后调用派生类的构造函数。 如果在类定义中显式地指定了初始化列表中的基类或成员变量初始化顺序,则按照指定的顺序进行初始化。...因此,析构函数中应尽量避免抛出异常。 总结 构造函数和析构函数是C++中用于管理对象生命周期的特殊成员函数。...构造函数的初始化列表提供了一种高效的初始化方式;析构函数则用于释放资源并确保对象的正确销毁。 构造函数分类 构造函数在C++中扮演着初始化对象的重要角色。...在C++中,如果需要执行深拷贝,通常需要显式地定义拷贝构造函数和拷贝赋值运算符。

    13910

    C++基础-类和对象

    面向对象编程有四个重要的基础概念:抽象、封装、继承和多态。本文整理 C++ 中类与对象的基础内容,涉及抽象和封装两个概念。《C++基础-继承》一文讲述继承概念。《C++基础-多态》一文讲述多态概念。...这些内容是 C++ 中最核心的内容。 抽象 抽象是一种忽略个性细节、提取共性特征的过程。当用“房子”指代由玻璃、混凝土、木材组成的建筑物时就是在使用抽象。...初始化列表是一种简写形式,将相关数据成员的初始化列表写在函数名括号后,从而可以省略函数体中的相应数据成员赋值语句。...在类成员方法中调用其他成员方法时, 编译器将隐式地传递 this 指针。 调用静态方法时,不会隐式地传递 this 指针,因为静态函数不与类实例相关联,而由所有实例共享。...要在静态函数中使用实例变量,应显式地声明一个形参,并将实参设置为 this 指针。 6. sizeof 用于类 sizeof 用于类时,值为类声明中所有数据属性占用的总内存量,单位为字节。

    98620

    C语言与C++面试知识总结

    在以下场景中,经常需要显式引用 this 指针: 为实现对象的链式引用; 为避免对同一对象进行赋值操作; 在实现一些数据结构时,如 list。...C 语言代码处理,可以避免 C++ 因符号修饰导致代码不能和C语言库中的符号进行链接的问题。...继承:结构体嵌套 多态:父类与子类方法的函数指针不同 explicit(显式)关键字 explicit 修饰构造函数时,可以防止隐式转换和复制初始化 explicit 修饰转换函数时,可以防止隐式转换...b4 = { 1 }; // 错误:被 explicit 修饰构造函数的对象不可以复制列表初始化 B b5 = (B)1; // OK:允许 static_cast 的显式转换 doB(1);...原因:C++ 是静态绑定语言,编译器管理栈上对象的生命周期,编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性。

    5K41

    什么?CC++面试过不了?因为你还没看过这个!

    在以下场景中,经常需要显式引用 this 指针: 为实现对象的链式引用; 为避免对同一对象进行赋值操作; 在实现一些数据结构时,如 list。...C 语言代码处理,可以避免 C++ 因符号修饰导致代码不能和C语言库中的符号进行链接的问题。...继承:结构体嵌套 多态:父类与子类方法的函数指针不同 explicit(显式)关键字 explicit 修饰构造函数时,可以防止隐式转换和复制初始化 explicit 修饰转换函数时,可以防止隐式转换...b4 = { 1 }; // 错误:被 explicit 修饰构造函数的对象不可以复制列表初始化 B b5 = (B)1; // OK:允许 static_cast 的显式转换 doB(1);...原因:C++ 是静态绑定语言,编译器管理栈上对象的生命周期,编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性。

    3.7K50

    Effective_Cpp中的55个建议

    杂项讨论 本文将Effective C++中55条建议的关键内容进行了记录和总结。 注:本文适合用来复习,无法用来代替第一遍学习。 其中有几条还有待复习,在前面标注了?。...1.内置的int double等数据类型一定要手工初始化,因为C++不保证初始化它们。 2.构造函数最好使用成员初始化列表,因为如果放在函数体内就成了赋值了。...这样先初始化一遍,然后进行赋值,之前的初始化就白做了。(初始化列表的成员顺序一定要和成员的声明顺序相同。)...27:尽量少做转型动作 1.如果可以,尽量避免转型,特别是在注重效率的代码中避免dynamic_cast,试着改成无需转型的设计。...33:避免遮掩继承而来的名称 1.只要名称相同,子类的成员函数就会把基类中所有同名函数覆盖掉。 2.为了让被遮掩的名称再见天日,可使用using声明式或转交函数。

    60730

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

    确保objects对象在使用前被初始化 5. 了解 C++ 为你偷偷地加上和调用了什么函数 6. 如果不想使用compiler-generated functions编译器生成函数,就明确拒绝 7....确保objects对象在使用前被初始化 一个更好的方式是在构造函数中使用初始化列表,而不是一个个赋值。 在初始化时,要考虑是声明在全局还是局部。 5....在资源管理类中准备访问裸资源(raw resources) API 经常需要访问裸资源,所以每一个 RAII 类都应该提供取得它所管理的资源的方法。 访问可以通过显式转换或者隐式转换进行。...典型情况下它更高效而且可以避免切断问题。 这条规则并不适用于内建类型及 STL 中的迭代器和函数对象类型。对于它们,传值通常更合适。 21....避免覆盖(hiding)“通过继承得到的名字” derived classes 中的名字覆盖 base classes 中的名字,在 public inheritance 中,这从来不是想要的。

    22110

    【C++进阶篇】像传承家族宝藏一样理解C++继承

    然而,C++继承的设计和使用也存在一些挑战,特别是在多继承和虚继承的场景下。理解如何合理使用继承关系,避免继承层次过深,避免继承滥用,是程序员需要掌握的关键技能。...为了访问基类的 _num,我们使用了 Person::_num 来显式地指定访问基类中的成员。这样可以避免由于成员同名而导致的混淆。 实际开发中不建议写同名的变量名或函数名。...5.1.1 函数的隐藏 在C++中,函数隐藏指的是子类中定义的一个与父类中已有的成员函数具有相同名称和参数列表的函数,导致父类的函数在子类中被“隐藏”或“遮蔽”的现象。...5.2 派生类的默认成员函数 在 C++ 中,当我们不显式定义类的构造函数、拷贝构造函数、赋值运算符和析构函数时,编译器会自动为我们生成这些函数。..., _id(id) {} //拷贝构造函数 Student(const Student& s) :Teacher(s)//基类没有默认构造函数,则派生类的构造函数必须在初始化列表中显式调用基类的构造函数

    10810

    C++【继承】

    ---- 前言 继承 是面向对象三大特性之一(封装、继承、多态),所有的面向对象(OO)语言都具备这三个基本特征,封装相关概念已经在《类和对象》系列中介绍过了,今天主要学习的是 继承,即如何在父类的基础之上...,当子类中的方法出现 隐藏 行为时,优先执行 子类 中的方法;当子类中的成员出现 隐藏 行为时,优先选择当前作用域中的成员(局部优先) 这已经证明了 父子类中的作用域是独立存在的 如何显式的使用父类的方法或成员...总的来说,子类中的默认成员函数调用规则可以概况为以下几点: 子类的构造函数必须调用父类的构造函数,初始化属于父类的那一部分内容;如果没有默认构造函数,则需要显式调用 子类的拷贝构造、赋值重载函数必须要显式调用父类的...,否则会造成重复析构问题 父类的析构函数在子类对象销毁后,会自动调用,然后销毁父类的那一部分 注意: 子类对象初始化前,必须先初始化父类那一部分 *子类对象销毁后,必须销毁父类那一部分 不能显式的调用父类的析构函数...在通过后者实现前者时,可以通过 组合,也可以通过 继承 ---- 总结 以上就是本次关于 C++【继承】的全部内容了,在本篇文章中,我们重点介绍了继承的相关知识,如什么是继承、如何继承、继承该注意些什么

    15410

    C++设计类的注意事项

    构造函数用来创建新对象,它是不能被派生类继承的,派生类需要定义自己的构造函数,并在初始化列表中调用基类的构造函数: SubClass::SubClass(int a, int b):BaseClass(...和普通构造函数一样,如果你没定义复制构造函数,编译器将提供一个,旦最好显式地自己定义一个,对于一些用new初始化的成员,自行用深复制来做复制,否则编译器提供的只是简单的浅复制,在删除时会出问题。...在定义派生类的赋值操作符重载函数时,要显式地在函数块中通过::来调用基类的赋值操作符,来操作基类的成员,毕竟派生类很多时候无法直接访问到基类成员,只能通过调用基类的公开方法来访问,而且也不能通过初始化列表的方式来调用...,但是基类引用是可以指向子类的,它只会操作基类的成员 ...// 操作派生类的成员 return *this; } 析构函数 一定要注意显式定义析构函数来释放构造函数使用new分配的所有内存。...另外,也由于C++支持用基类的引用指向派生类时,对于虚函数会调用其真实类型的函数,这保证了灵活的使用。只是要注意如果在函数中不修改对象,最好用const修饰对象参数,避免修改。

    39920

    《Effective C++》学习笔记

    条款04:确定对象被使用前已先被初始化 确定对象在使用前已经初始化,避免一些难以预测的问题。 为内置类型手动做初始化,C++不保证初始化它们。...构造函数使用成员初始化列表来赋值,而不是在构造函数里去赋值(会导致赋值两次,浪费了),列表的排列次序保持和class中声明次序一致。...循环前:1个构造函数+1个析构函数+n个赋值操作 循环后:n个构造函数+n个析构函数 条款27:尽量少做转型操作 尽量避免使用转型cast(包括C的类型转换和C++的四个新式转换函数),特别是注重效率的代码中避免用...对于嵌套从属类型名称(即依赖于模板参数类型的一个子类型,例如迭代器),必须用typename来修饰,但不能在模板类的基类列和初始化列表中修饰基类。...这样就能使用一种类型特化出的自制智能指针来构造另一种类型特化出的自制智能指针了。同时,在初始化列表中编译器会为你检查是否允许该类型转换(比如只允许子类往父类的转换,不能相反)。

    1.1K20

    C++相关基础知识总结笔记

    如果基类没有默认构造函数,或者需要传递参数给基类构造函数,可以在派生类的构造函数初始化列表中显式调用基类的构造函数。 构造函数的规则 如果类中定义了任何构造函数,编译器就不会自动生成默认构造函数。...这意味着不能有多个具有不同参数列表的析构函数。 不能带参数:析构函数不能带有任何参数。 析构函数的类型 默认析构函数:如果类中没有显式定义析构函数,编译器会自动生成一个默认析构函数。...默认析构函数:如果类中没有显式定义析构函数,编译器会自动生成一个默认析构函数。如果类中有成员需要显式清理,则应显式定义析构函数。...保证对象的完整性:析构函数确保对象在销毁时处于一个完整且一致的状态。 例如,释放持有的锁,避免资源泄露。 什么时候必须要用初始化列表初始化?...,并且基类的构造函数需要参数,那么必须在派生类的构造函数初始化列表中显式调用基类构造函数。

    21330

    类继承

    可以使⽤初始化器列表语法指明要使⽤的基类构造函数,否则将使⽤默认的基类构造函数。 派⽣类对象过期时,程序将⾸先调⽤派⽣类析构函数,然后再调⽤基类析构函数。...成员初始化列表: 派⽣类构造函数可以使⽤初始化器列表机制将值传递给基类构造函数。...基类指针可以在不进⾏显式类型转换的情 况下指向派⽣类对象; 基类引⽤可以在不进⾏显式类型转换的情况下引⽤派⽣类对象: 基类引⽤定义的函数或指针参数可⽤于基类对象或派⽣类对象; ```c++ void...//派⽣类的显式赋值运算符必须负责所有继承的baseDMA基类对象的赋值,可以通过显式调⽤基类赋值运算符来完成这项⼯作 hasDMA& hasDMA::operator=(const hasDMA& hs...对于析构函数,这是⾃动完成的; 对于构造函数,这是通过在初始化成员列表中调⽤基类的复制构造函数来完成的;如果不这样做,将⾃动调⽤基类的默认构造函 数。

    1.3K30

    【C++篇】C++类与对象深度解析(二):类的默认成员函数详解

    类的默认成员函数 在C++中,默认成员函数是指用户没有显式实现,而由编译器自动生成的成员函数。一个类在没有显式定义特定成员函数的情况下,编译器会自动生成以下6个默认成员函数。...如果类中没有显式定义构造函数,编译器会自动生成一个无参的默认构造函数。...跟构造函数类似,编译器自动生成的析构函数对内置类型成员不做处理 如果类中没有显式定义析构函数,编译器会自动生成一个默认析构函数。这个默认析构函数对内置类型的成员变量不做任何处理。...解释:当显式定义析构函数时,C++确保所有自定义类型的成员都会在对象销毁时调用其析构函数,正确地释放资源。...若未显式定义拷贝构造函数,编译器会自动生成 如果类中没有显式定义拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数。

    19810
    领券