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

读完某C++神作,我只记下了100句话

设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针。数组下标的正确类型是size_t。 预处理器变量NULL在编译时会被数值0替换。指针做减法操作得到的是ptrdiff_t类型。...包含signed和unsigned int的表达式会被转换成unsigned,如果为负数会有问题。 数组名用做sizeof或取地址&的操作数时不被当做指针。...非引用形参将复制实参值,非引用return将复制return的东西。即使定义了其他构造函数,也会合成复制构造函数【能够复制类中的数组】。类成员有指针一般需要显示定义复制构造函数。...派生类指针的静态类型和动态类型不一致时【基类指针指向派生类是时】,为保证删除指针调用合适的析构函数【多态】,基类析构必须为virtual。...纯虚函数==抽象类==无法创建对象 派生类对象复制到基类时派生类对象将被切掉【而指针和引用不会】。

1.4K20

C++面试知识总结

若操作数具有类型char、unsigned char或signed char,其结果等于1。 当操作数是指针时,sizeof依赖于系统的位数。 当操作数具有数组类型时,其结果是数组的总字节数。...联合类型操作数的sizeof是其最大字节成员的字节数。 结构类型操作数的sizeof是这种类型对象的总字节数。 如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。...基类函数有virtual,是覆盖,没有virtual就是隐藏。...,派生类的成员函数可以访问基类中的公有和受保护成员;公有继承时基类受保护的成员,可以通过派生类对象访问但不能修改。...私有继承时,基类的成员只能被直接派生类的成员访问,无法再往下继承。 受保护继承时,基类的成员也只被直接派生类的成员访问,无法再往下继承。

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

    C++查缺补漏

    在某些情况下,我们没有必要复制对象——只需要移动它们 有可被利用的临时对象时,触发移动构造 //函数返回含有指针成员的对象 //将要返回的局部对象转移到主调函数,省去了构造和删除临时对象的过程 #include...为最远的派生类提供唯一的基类成员,而不重复产生多次复制 注意: 在第一级继承时就要将共同基类设计为虚基类 虚基类及其派生类构造函数 建立对象时所指定的类称为最远派生类 虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的...virtual 关键字 派生类可以不显式地用virtual声明虚函数,这时系统就会用以下规则来判断派生类的一个函数成员是不是虚函数: 该函数是否与基类的虚函数有相同的名称、参数个数及对应参数类型 该函数是否与基类的虚函数有相同的返回值或者满足类型兼容规则的指针...(virtual table) 虚表中有当前类的各个虚函数的入口地址 每个对象有一个指向当前类的虚表的指针(虚指针vptr) 动态绑定的实现 构造函数中为对象的虚指针赋值 通过多态类型的指针或引用调用成员函数时...- 在虚函数显式重载中运用,编译器会检查基类是否存在一虚拟函数,与派生类中带有声明override的虚拟函数,有相同的函数签名(signature);若不存在,则会回报错误 多态行为的基础:基类声明虚函数

    2.6K10

    一文让你学完C++,干货收藏!!!

    指针可以在任何时候指向到另一个对象。 引用必须在创建时被初始化。指针可以在任何时间被初始化。...当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。 继承代表了 is a 关系。...当使用不同类型的继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问...私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。 多继承 多继承即一个子类可以有多个父类,它继承了多个父类的特性。...数据抽象的好处 数据抽象有两个重要的优势: 类的内部受到保护,不会因无意的用户级错误导致对象状态受损。

    3.4K20

    2W五千字的C++基础知识整理汇总

    指针可以在任何时候指向到另一个对象。 引用必须在创建时被初始化。指针可以在任何时间被初始化。...当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。 继承代表了 is a 关系。...当使用不同类型的继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问...私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。 多继承 多继承即一个子类可以有多个父类,它继承了多个父类的特性。...数据抽象的好处 数据抽象有两个重要的优势: 类的内部受到保护,不会因无意的用户级错误导致对象状态受损。

    2.6K10

    一文让你学完C++,干货收藏!!!

    指针可以在任何时候指向到另一个对象。 引用必须在创建时被初始化。指针可以在任何时间被初始化。...当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。 继承代表了 is a 关系。...当使用不同类型的继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问...私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。 多继承 多继承即一个子类可以有多个父类,它继承了多个父类的特性。...数据抽象的好处 数据抽象有两个重要的优势: 类的内部受到保护,不会因无意的用户级错误导致对象状态受损。

    2.3K20

    一文让你学完C++,干货收藏!!!

    指针可以在任何时候指向到另一个对象。 引用必须在创建时被初始化。指针可以在任何时间被初始化。...当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。 继承代表了 is a 关系。...当使用不同类型的继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问...私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。 多继承 多继承即一个子类可以有多个父类,它继承了多个父类的特性。...数据抽象的好处 数据抽象有两个重要的优势: 类的内部受到保护,不会因无意的用户级错误导致对象状态受损。

    3K3029

    《逆袭进大厂》之C++篇49问49答

    &a是数组的指针,其类型为int (*)[10](就是前面提到的数组指针),其加1时,系统会认为是数组首地址加上整个数组的偏移(10个int型变量),值为数组a尾元素后一个元素的地址。...,重写就是重写函数体,要求基类函数必须是虚函数且: 与基类的虚函数有相同的参数个数 与基类的虚函数有相同的参数类型 与基类的虚函数有相同的返回值类型 举个例子: //父类 class A{ public...上图中展示了虚表和虚表指针在基类对象和派生类对象中的模型,下面阐述实现多态的过程: (1)编译器在发现基类中有虚函数时,会自动为每个含有虚函数的类生成一份虚表,该表是一个一维数组,虚表里保存了虚函数的入口地址...在构造时,根据对象的类型去初始化虚指针vptr,从而让vptr指向正确的虚表,从而在调用虚函数时,能找到正确的函数 (3)所谓的合适时机,在派生类定义对象时,程序运行会自动调用构造函数,在构造函数中创建虚表并对虚表初始化...,派生类的虚表指针指向的是基类的虚表;当派生类对基类的虚函数重写时,派生类的虚表指针指向的是自身的虚表;当派生类中有自己的虚函数时,在自己的虚表中将此虚函数地址添加在后面 这样指向派生类的基类指针在运行时

    2K10

    《逆袭进大厂》之C++篇49问49答(绝对的干货)

    &a是数组的指针,其类型为int (*)[10](就是前面提到的数组指针),其加1时,系统会认为是数组首地址加上整个数组的偏移(10个int型变量),值为数组a尾元素后一个元素的地址。...,重写就是重写函数体,要求基类函数必须是虚函数且: 与基类的虚函数有相同的参数个数 与基类的虚函数有相同的参数类型 与基类的虚函数有相同的返回值类型 举个例子: //父类 class A{ public...上图中展示了虚表和虚表指针在基类对象和派生类对象中的模型,下面阐述实现多态的过程: (1)编译器在发现基类中有虚函数时,会自动为每个含有虚函数的类生成一份虚表,该表是一个一维数组,虚表里保存了虚函数的入口地址...在构造时,根据对象的类型去初始化虚指针vptr,从而让vptr指向正确的虚表,从而在调用虚函数时,能找到正确的函数 (3)所谓的合适时机,在派生类定义对象时,程序运行会自动调用构造函数,在构造函数中创建虚表并对虚表初始化...,派生类的虚表指针指向的是基类的虚表;当派生类对基类的虚函数重写时,派生类的虚表指针指向的是自身的虚表;当派生类中有自己的虚函数时,在自己的虚表中将此虚函数地址添加在后面 这样指向派生类的基类指针在运行时

    2.6K40

    C++中的类型转换

    ,每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。...static_cast,命名上理解是静态类型转换 使用场景: 用于类层次结构中基类和派生类之间指针或引用的转换 注意: 上行转换(派生类—->基类)是安全的;下行转换(基类—->派生类)由于没有动态类型检查...进行标明和替换 dynamic_cast,命名上理解是动态类型转换 使用场景: 只有在派生类之间转换时才使用dynamic_cast,type-id必须是类指针,类引用或者void 使用特点:...基类必须要有虚函数 对于下行转换,dynamic_cast是安全的(当类型不一致时,转换过来的是空指针),而static_cast是不安全的(当类型不一致时,转换过来的是错误意义的指针,可能造成踩内存...使用场景: 不到万不得已,不用使用这个转换符,高危操作 使用特点: reinterpret_cast可以将整型转换为指针,也可以把指针转换为数组 reinterpret_cast可以在指针和引用里进行肆无忌惮的转换

    1.9K20

    【TypeScript 演化史 — 第八章】字面量类型扩展 和 无类型导入

    非扩展字面量类型 可以通过显式地将变量标注为字面量类型来创建非扩展字面量类型的变量 const stringLiteral: "https" = "https"; // 类型 "https" (非扩展)...隐式any错误只会在编译器无法知道一个没有类型注解的变量的类型时才会报告。...} } 更好地检查表达式的操作数中的 null/undefined 在TypeScript 2.2中,空检查得到了进一步的改进。TypeScript 现在将带有可空操作数的表达式标记为编译时错误。...具体来说,下面这些会被标记为错误: 如果+运算符的任何一个操作数是可空的,并且两个操作数都不是any或string类型。...编译器可以类型检查所有的使用,并在自动完成列表中建议可用的成员: image.png 与类继承进行对比,有个区别:一个类只能有一个基类。

    4.6K10

    万字长文【C++】高质量编程指南

    (1)不能再类声明中初始化 const数据成员,因为类的对象未被创建时,编译器不知道 SIZE的值是多少。...(2)free或delete释放了内存之后,没有将指针设置为NULL,导致产生了 野指针 8.2.3.指针与数组对比 数组要么在静态存储区被创建,如全局数组,要么在栈上被创建。...*),而不是p所指的内存容量 //当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针 void Func(char a[100]) { sizeof(a);//4 而不是100 } 8.2.4...,成为野指针的原因有: 1,指针变量没有被初始化 指针变量在创建的同时应当被初始化,要么将指针设置为 NULL,要么让它指向合法的内存。...1,如果派生类的函数与基类的函数同名,但是参数不同,此时,不论有没virtual,基类函数将被隐藏:区别重载 2,如果派生类函数与基类的函数同名,并且参数也显然,但是基类没有virtual关键字,此时

    1.6K20

    CC++面试题之语言基础篇(一)

    c的三大特点是: 封装:封装是将数据和操作数据的方法封装在一个单元(类)内部,然后通过公共接口暴露有限的访问权限。...需要手动将其转换为适当的类型 new 会调用构造函数来初始化对象(如果是自定义类的对象),而 malloc 不会执行构造函数。 void * void * 是通用指针类型,被称为"无类型指针"。...使用 void * 指针时需要谨慎,必须进行类型转换 示例(int 型转换): int * intPtr=static_case(ptr); 因为不提供类型检查,可能导致运行时类型错误。...简述C++从代码到可执行二进制文件.exe的过程 有四个过程,预编译、编译、汇编、链接 C++函数只声明,不定义会在哪步报错 实际的错误通常发生在链接阶段,当链接器尝试将所有编译单元(源文件)组合在一起时...深拷贝∶创建一个新的对象和数组,将原对象的各项属性的"值”(数组的所有元素)拷贝过来,是“值",深拷贝会在堆内存Q中另外申请空间来储存数据,从而解决了指针悬挂问题。

    30910

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

    所有其他的非静态数据成员都不会被初始化。 110、抽象基类为什么不能创建对象? 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层。...2) 向下类型转换 将基类指针或引用转换为派生类指针或引用被称为向下类型转换,向下类型转换不会自动进行,因为一个基类对应几个派生类,所以向下类型转换时不知道对应哪个派生类,所以在向下类型转换时必须加动态类型识别技术...当在类的非静态成员函数访问类的非静态成员时,编译器会自动将对象的地址传给作为隐含参数传递给函数,这个隐含参数就是this指针。...把你知道的都说一说 1) 构造函数,构造函数初始化对象,派生类必须知道基类函数干了什么,才能进行构造;当有虚函数时,每一个类有一个虚表,每一个对象有一个虚表指针,虚表指针在构造函数中初始化; 2)...虚函数是为了实现动态编联产生的,目的是通过基类类型的指针指向不同对象时,自动调用相应的、和基类同名的函数(使用同一种调用形式,既能调用派生类又能调用基类的同名函数)。

    2.2K30

    JAVA和C++对比学习

    的异常可以是任何类型的数据,不强制处理 应该使用异常代替错误码返回值,而且应该通过宏功能让异常加入更多源代码信息,程序员应该强制自己处理所有的异常。...C++变量类型长度不固定,有带符号和不带符号的区别 为了在32和64位机上通用,通常需要定义uint32_t之类的类型来统一长度 JAVA变量长度固定,全部都是带符号的 3.3 复合变量类型 C++.... -> []数种利用指针操作数据的手段,对于内存操作非常灵活 JAVA固定了基本类型只能按值传递,类对象只能按句柄(值)传递,类似某种智能指针 严格理解按值传递和句柄的理解,严防不合理的修改类对象数据...也可以自己实现clone(),hashCode(),equals()来实现细节 3.6 数组 C++的数组是连续内存空间 数组常用于申请一块内存供任何用途,从而缺乏对指针的控制,应该学习JAVA的数组,...权限的内容 4.5 构造器 C++有初始化列表,可以在其中选择不同的基类构造函数 JAVA在子类构造器中假模假样的调用一下选择的基类构造器,实际上那行代码并非在那个时间被调用 JAVA缺乏明确的初始化个成员以及自己的语法

    2.7K40

    TarsCpp 组件 之 智能指针详解

    引用计数原理 引用计数是智能指针的一种通用实现技术,上图为大致流程,基本原理如下: 1.在每次创建类的新对象时,初始化指针并将引用计数置 1; 2.当对象作为另一对象的副本而创建时(复制构造函数),复制对应的指针并将引用计数...+1; 3.当对一个对象进行赋值时,赋值操作符 = 将左操作数所指对象的引用计数 -1,将右操作数所指对象的引用计数 +1; 4.调用析构函数数,引用计数 -1; 5.上述操作中,引用计数减至 0 时...在 TARS 中,智能指针类 TC_AutoPtr 是一个模板类,支持拷贝和赋值等操作,其指向的对象必须继承自智能指针基类 TC_HandleBase ,包含了对引用计数的加减操作。...而通常对于非原子类型而言,并发访问某个对象(如果不做任何同步操作)会导致未定义 (undifined) 行为发生。...智能指针基类 TC_HandleBase TC_HandleBase 是 TARS 的智能指针基类,包含两个成员变量 _atomic 和 _bNoDelete,定义如下 TC_HandleBase,为

    94420

    c++面试选择题_C语言经典笔试题

    对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。...定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数;析构的时候恰好相反:先调用派生类的析构函数、然后调用基类的析构函数。...从基类继承来的纯虚函数,在派生类中仍是虚函数。 抽象类中不仅包括纯虚函数,也可包括虚函数。抽象类必须用作派生其他类的基类,而不能用于直接创建对象实例。但仍可使用指向抽象类的指针支持运行时多态性。...数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。...注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

    1.1K10

    《逆袭进大厂》第二弹之C++进阶篇59问59答(超硬核干货)

    1、 动态数组管理new一个数组时,[]中必须是一个整数,但是不一定是常量整数,普通数组必须是一个常量整数; 2、 new动态数组返回的并不是数组类型,而是一个元素类型的指针; 3、 delete[]时...3、构造函数不须要是虚函数,也不同意是虚函数,由于创建一个对象时我们总是要明白指定对象的类型,虽然我们可能通过实验室的基类的指针或引用去訪问它但析构却不一定,我们往往通过基类的指针来销毁对象。...1) 对象生命周期结束,被销毁时; 2) delete指向对象的指针时,或delete指向对象的基类类型指针,而其基类虚构函数是虚函数时; 3) 对象i是对象o的成员,o的析构函数被调用时,对象i...同样,进入基类析构函数时,对象也是基类类型。...每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至

    2.4K40

    C++经典面试题(最全,面中率最高)

    对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。...定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数;析构的时候恰好相反:先调用派生类的析构函数、然后调用基类的析构函数。...抽象类必须用作派生其他类的基类,而不能用于直接创建对象实例。但仍可使用指向抽象类的指针支持运行时多态性。...数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。...注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

    2.1K30
    领券