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

C++面试知识总结

引用在创建的同时必须初始化,保证引用的对象是有效的,所以不存在NULL引用。 指针在定义的时候不必初始化,所以,指针则可以是NULL,可以在定义后面的任何地方重新赋值。...引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用。 指针在任何时候都可以改变为指向另一个对象。 引用的创建和销毁并不会调用类的拷贝构造函数。...2.18 static全局变量与普通的全局变量的区别 全局变量在整个工程文件内都有效。 静态全局变量只在定义它的文件内有效。 全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。...3.9 类成员中只能使用构造函数的初始化列表而不能赋值的有哪些 const成员 引用成员 3.10 函数模板与类模板的区别 函数模板是模板的一种,可以生成各种类型的函数实例,函数模板的实例化是由编译程序在处理函数调用时自动完成的...3.13 const总结 欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了。

1.8K41

《Effective C++》学习笔记

条款04:确定对象被使用前已先被初始化 确定对象在使用前已经初始化,避免一些难以预测的问题。 为内置类型手动做初始化,C++不保证初始化它们。...对于一些可能在被别的类直接调用其成员函数、值的类,最好改为暴露一个返回其类对象的引用的函数的形式,而不是暴露其类对象本身,这可以保证在函数内完成初始化,避免被调用时还没有初始化。...如果一定要用,试着考虑无需转型的替代设计,例如为基类添加一个什么也不做的衍生类使用的函数,避免在使用时需要将基类指针转型为子类指针。...条款43:学习处理模板化基类内的名称 如果基类是模板类,那么衍生类直接调用基类的成员函数无法通过编译器,因为可能会有特化版的模板类针对某个类不声明该接口函数。...做法是声明一个泛化构造函数,也就是定义一个模板构造函数,接收模板参数,声明一个指向的真实对象指针,声明一个获取该对象指针的get函数,用该get函数放在初始化列表中来构造模板类。

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

    C++ 特性使用建议

    通常友元应该定义在同一文件内,避免代码读者跑到其它文件查找使用该私有成员的类。...某些情况下,相对于将类成员声明为 public,使用友元是更好的选择,尤其是如果你只允许另一个类访问该类的私有成员时。当然,大多数类都只应该通过其提供的公有成员进行互操作。...如果你需要在运行期间确定一个对象的类型,这通常说明你需要考虑重新设计你的类。 (2)随意地使用 RTTI 会使你的代码难以维护。它使得基于类型的判断树或者 switch 语句散布在代码各处。...9.类型转换 不要使用 C 风格类型转换,而应该使用 C++ 风格的类型转换。 (1)用 static_cast 替代 C 风格的值转换,或某个类指针需要明确的向上转换为父类指针时。...(3)如果你使用模板编程,你必须考虑尽可能的把复杂度最小化,并且尽量不要让模板对外暴漏。你最好只在实现里面使用模板,然后给用户暴露的接口里面并不使用模板,这样能提高你的接口的可读性。

    1.7K20

    手把手教你c语言基础语法——结构体

    ,他并没有创建一个实际的数据对象,而是描述了一个组成这类对象的元素,【因此,我们也有时候将结构体声明叫做模板,因为它勾勒出数据该如何存储,并没有实例化数据对象】。...如果这种声明在某个函数的内部,则它的标记只能咋内部使用,并且在其声明之后; 2.3关于我们不断说的,标记名是可选的,那么我们什么时候可以省略,什么时候一定不能省略呢?.../要对应起来,用逗号分隔开来,与数组初始化一样; 4.2加入一点小知识,关于结构体初始化和存储类时期的问题 如果要初始化一个具有静态存储时期的结构体,初始化项目列表中的值必须是常量表达式, 如果存储时期是自动的...,那么列表的值就不必是常量了; 关于这点在讲存储类时期的时候在分析; 4.3注意: 如果在定义结构体变量的时候没有初始化,那么后面就不能全部一起初始化了; 意思就是: /////////这样是可以的,在定义变量的时候就初始化了...; 6.3结构体数组的初始化 两种初始化:就是在定义的时候赋值的两种情况; 6.4访问结构体数组的成员 规则:在结构体名后加点运算符,然后再是成员名; library[5].title;//表示第5个元素的

    1K00

    与C++类和对象的宿命(下)

    如果显示给了初始化的话,那么就按照显示的,如果我们在声明变量的时候进行了变量的缺省操作的话,并且我们给了值的话,那么就按照我们给的值进行初始化操作 class Time { public : Time...⽰在初始化列表初始化的成员使⽤的 我们可以在声明的时候给上缺省值,这个声明是给初始化列表的 如果我们在初始化列表中给出了初始化的话,那么我们下面变量的缺省操作就会被省略了,直接用上我们给的值 显示给了初始化...,那么就不会尊崇声明的时候的缺省值 缺省值就是最卑微的,如果什么都没给的话,那么就是用缺省值 */ • 尽量使⽤初始化列表初始化,因为那些你不在初始化列表初始化的成员也会⾛初始化列表,如果这个成员在声明位置给了缺省值...,因为那些你不在初始化列表初始化的成员也会⾛初始化列表 对于这句话的来说的话 对于上面说到的特殊的三类,我们能否使用缺省值进行初始化操作呢 没显示写的话我们有缺省值也是可以的 在声明变量的时候直接声明缺省值就行了...,我们会在初始化的时候进行缺省值的调用操作的 以后得构造函数初始化成员尽量使用初始化列表 优先就是显示初始化 没有缺省值就是调用对应类型的默认构造函数 • 初始化列表中按照成员变量在类中声明顺序进⾏初始化

    20410

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

    ,并且必须有构造函数;不同类对其const数据成员的值可以不同,所以不能在类中声明时初始化 const成员函数:const对象不可以调用非const成员函数;非const对象都可以调用;不可以改变非mutable...拷贝初始化首先使用指定构造函数创建一个临时对象,然后用拷贝构造函数将那个临时对象拷贝到正在创建的对象。...在构造子类对象时,会先调用父类的构造函数,此时,编译器只“看到了”父类,并为父类对象初始化虚表指针,令它指向父类的虚表;当调用子类的构造函数时,为子类对象初始化虚表指针,令它指向子类的虚表 (4)当派生类对基类的虚函数没有重写时...深拷贝 深拷贝不仅拷贝值,还开辟出一块新的空间用来存放新的值,即使原先的对象被析构掉,释放内存了也不会影响到深拷贝得到的值。在自己实现拷贝赋值的时候,如果有指针变量的话是需要自己实现深拷贝的。...而内联函数可以进行参数类型检查(编译时),且具有返回值。 内联函数本身是函数,强调函数特性,具有重载等功能。 内联函数可以作为某个类的成员函数,这样可以使用类的保护成员和私有成员,进而提升效率。

    2K10

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

    (const int& i){ //... } 考虑类的情况 const成员变量:不能在类定义外部初始化,只能通过构造函数初始化列表进行初始化,并且必须有构造函数;不同类对其const数据成员的值可以不同...拷贝初始化首先使用指定构造函数创建一个临时对象,然后用拷贝构造函数将那个临时对象拷贝到正在创建的对象。...在构造子类对象时,会先调用父类的构造函数,此时,编译器只“看到了”父类,并为父类对象初始化虚表指针,令它指向父类的虚表;当调用子类的构造函数时,为子类对象初始化虚表指针,令它指向子类的虚表 (4)当派生类对基类的虚函数没有重写时...深拷贝 深拷贝不仅拷贝值,还开辟出一块新的空间用来存放新的值,即使原先的对象被析构掉,释放内存了也不会影响到深拷贝得到的值。在自己实现拷贝赋值的时候,如果有指针变量的话是需要自己实现深拷贝的。...而内联函数可以进行参数类型检查(编译时),且具有返回值。 内联函数本身是函数,强调函数特性,具有重载等功能。 内联函数可以作为某个类的成员函数,这样可以使用类的保护成员和私有成员,进而提升效率。

    2.6K40

    C++复习篇

    25.泛型函数模板(兼容不同类型) 26.泛型类模板(兼容不同类型) 27.数值型函数模板和数值型类模板(兼容不同数值) 28.C++智能指针 29.Qt中的智能指针 1.const const和define...对于其它普通变量如果不初始化的话则为随机值....使用new创建的对象变量,在不使用时,需要使用delete,才能调用析构函数 构造函数的调用顺序 1. 首先判断父类是否存在,若存在则调用父类构造函数 2....一般如果局部变量未初始化的话,都是随机值 堆 堆由程序员分配释放new/delete,所以需要注意内存泄漏问题 一般new分配的对象变量,其成员都是随机值 静态存储区 用来存放全局变量,一直会存在的,...的构造函数为explicit类型,所以只能显示初始化 提供get()成员函数,可以用来查看类里的指针地址 一个堆空间永远只属于一个对象(比如auto_ptr被拷贝/赋值,则自身的指针指向的地址会被抢占)

    1.3K20

    【干货】c语言基础语法——结构体

    但是注意,它并没有创建一个实际的数据对象,而是描述了一个组成这类对象的元素。 因此,我们有时候也将结构体声明叫做模板,因为它勾勒出数据该如何存储,并没有实例化数据对象。 ?...2.2;关于其struct声明的位置,也就是这段代码要放到哪里。同样这也是具有作用域的。 这种声明如果放在任何函数的外面,那么则可选标记可以在本文件中,该声明的后面的所有函数都可以使用。...如果这种声明在某个函数的内部,则它的标记只能在内部使用,并且在其声明之后; ? ? 2.3;关于我们不断说的,标记名是可选的,那么我们什么时候可以省略,什么时候一定不能省略呢?...22.5 //value为flaot型 }; //要对应起来,用逗号分隔开来,与数组初始化一样; 4.2;加入一点小知识; 关于结构体初始化和存储类时期的问题; 如果要初始化一个具有静态存储时期的结构体...,初始化项目列表中的值必须是常量表达式; 4.3;注意如果在定义结构体变量的时候没有初始化,那么后面就不能全部一起初始化了; 意思就是; /////////这样是可以的,在定义变量的时候就初始化了; struct

    93620

    【笔记】《Effective C++》条款1-25

    使用初值列初始化的时候还要注意成员依赖的问题, 时刻记得: 成员在初值列中初始化的顺序至于其在类内的声明顺序相同, 为了防止混乱我们应该也按照声明顺序在初值列进行排列 以上可能导致初值列本身产生重复,...++对于全局的static对象的初始化并没有顺序约束, 因此类初始化的时候有可能static成员还未初始化, 为了解决这个问题, 更好的方式是将static成员写在专属的函数内(单例模式), 等到调用那个函数的时候再进行懒初始化...传递变量时如果需要进行计算的话最好使用static函数, 这样能够保证不会使用到派生类中还未初始化的变量 10 令operator=返回一个reference to *this 为了实现连锁赋值的惯例操作...如果有一些成员变量没有在初值列中进行拷贝, 那么此时对象将会进入局部拷贝状态 如果只拷贝了成员变量而没有调用基类的拷贝函数, 那么此时基类部分将会被默认初始化, 也属于一种局部拷贝 很多时候基类的拷贝函数与派生类的拷贝函数会有很多代码的重叠部分...的设计 有以下几点一定要在创立前进行思考: 如何创建和销毁 初始化和赋值的区别 如果被按值传递的话会有什么区别 有哪些是"合法值" 需要继承/被继承么 需要哪些类型转换 需要哪些操作符 哪些编译器函数需要拒绝

    1.1K30

    两万字总结《C++ Primer》要点

    初始化的含义是创建变量的时候赋予一个初始值,而赋值的含义是把对象的当前值擦除,用一个新值来替代。两者区别很小。 (3)列表初始化 用花括号来初始化变量的方式,称为列表初始化。...P259 (3)委托构造函数 使用它所述类的其他构造函数执行它自己的初始化过程。 (4)如果去抑制构造函数定义的隐式转换? 在类内声明构造函数的时候使用explicit关键字。...一般的,应该尽量减少捕获的数据量,来避免潜在的问题。 如果可能,避免捕获指针或引用。 ::: 隐式捕获: 当混合使用隐式捕获和显式捕获时,捕获列表中的第一个元素必须是一个&或=。...} 在一个析构函数中,不存在类似构造函数中初始化列表的东西来控制成员如何销毁,析构部分是隐式的。销毁类类型的成员需要执行成员自己的析构函数。...派生类中的虚函数: 一个派生类如果覆盖了某个继承而来的虚函数,则它的形参类型必须与被它覆盖的基类函数完全一致。

    2.1K30

    两万字总结《C++ Primer》要点

    初始化的含义是创建变量的时候赋予一个初始值,而赋值的含义是把对象的当前值擦除,用一个新值来替代。两者区别很小。 (3)列表初始化 用花括号来初始化变量的方式,称为列表初始化。...P259 (3)委托构造函数 使用它所述类的其他构造函数执行它自己的初始化过程。 (4)如果去抑制构造函数定义的隐式转换? 在类内声明构造函数的时候使用explicit关键字。...一般的,应该尽量减少捕获的数据量,来避免潜在的问题。 如果可能,避免捕获指针或引用。 ::: 隐式捕获: 当混合使用隐式捕获和显式捕获时,捕获列表中的第一个元素必须是一个&或=。...} 在一个析构函数中,不存在类似构造函数中初始化列表的东西来控制成员如何销毁,析构部分是隐式的。销毁类类型的成员需要执行成员自己的析构函数。...派生类中的虚函数: 一个派生类如果覆盖了某个继承而来的虚函数,则它的形参类型必须与被它覆盖的基类函数完全一致。

    1.8K20

    Google C++ 编程风格指南(三):类

    若未声明构造函数, 则编译器会生成一个默认的构造函数, 这有可能导致某些成员未被初始化或被初始化为不恰当的值. 定义: new 一个不带参数的类对象时, 会调用这个类的默认构造函数....在类成员里面进行初始化是指声明一个成员变量的时候使用一个结构例如 int _count = 17 或者 string _name{"abc"} 来替代 int _count 或者 string _name...如果一个成员变量在声明时初始化又在构造函数中初始化, 有可能造成混乱, 因为构造函数中的值会覆盖掉声明中的值....结论: 简单的初始化用类成员初始化完成, 尤其是当一个成员变量要在多个构造函数里用相同的方式初始化的时候....如果你的类中有成员变量没有在类里面进行初始化, 而且没有提供其它构造函数, 你必须定义一个 (不带参数的) 默认构造函数. 把对象的内部状态初始化成一致 / 有效的值无疑是更合理的方式.

    83040

    【笔记】《C++Primer》—— 第三部分:类设计者的工具

    13 拷贝控制 拷贝构造函数会自动将每个非static成员依次拷贝到正在创建的对象中,其中内置类型会直接拷贝,数组会被逐元素地拷贝,类类型会调用拷贝构造函数来拷贝 如果初始化值要求一个explicit...每次继承一个基类就会在内存中生成一个子对象,存放了基类的成员,也正是因为这个原因派生类可以转换为基类 派生类的构造函数需要负责所有成员的初始化,尽管派生类也可以初始化继承来的基类成员,但是这不符合通常的编码思路...final,表示不允许继续覆盖 有时候希望某个基类只用来被继承而不允许实例化,这时候我们可以给这个基类加入纯虚函数,拥有纯虚函数的基类叫抽象基类,不能被直接创建。...类模板不会推断参数的类型 类模板的成员函数只有在使用时才会实例化 类模板与另一个模板直接最常见的友元是一对一的友元,首先模板需要声明所有需要用到的名字,然后在声明友元时标注出目标类的具体模板实参 类模板也可以一对多友元...但如果只是部分特例化的模板则仍然是模板,则依然会参与匹配 我们也可以特例化类模板,此时必须在原模板定义的命名空间中特例化它。

    1.7K10

    【笔记】《C++Primer》—— 第19章:特殊工具与技术

    同样的我们可以使用全局访问符来忽略掉我们自己定义在类内的函数 和我们习惯的一样直接使用new和delete的时候是不需要头文件的,但是如果我们需要重载operator new/delete的话我们需要包含头文件...(RTTI)是一种比较危险的操作,在我们想使用基类对象的指针或引用来执行某个派生类的非虚函数时使用,相关的运算符是typeid和dynamic_cast,如果可以的话最好还是应该用虚函数而不是直接改变类型...,避免了名称冲突的问题 默认情况下枚举值从0开始,逐个加1,值不一定唯一 枚举成员是const的,因此我们初始化时必须用const,使用的时候也可以当作const使用 枚举类的成员初始化后就必须使用同枚举类的成员才能赋值了...,自然也就不能有虚函数,但是其他的包括构造和析构函数都可以有 union只允许一个成员有值的特性让其存储空间仅仅是可以容纳其最大成员的大小 union常常用来表示一组互斥值,我们可以用花括号内的一个值来初始化一个...union,默认情况下这个值会被用来初始化union的第一个值 对union的一个值进行赋值会让其他的成员变为未定义的状态,因此我们需要时刻记得union此时有效的值是什么,一般来说我们通过在外层再包装一个类

    85340

    第 13 章 拷贝控制

    其中,拷贝和移动构造函数定义了当用同类型的另一个对象初始化本对象时做什么。拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么。...直接初始化时,实际上是编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数。而拷贝初始化是将右侧运算对象拷贝到正在创建的对象中,需要的话还会进行类型转换。...编译器略过了拷贝构造函数 在一个构造函数中,成员的初始化是在函数体执行之前完成的,且按照它们在类中出现的顺序进行初始化。...如果类的某个成员的析构函数是删除或不可访问的,或是类有一个没有类内初始化器的引用成员,或是类有一个没有类内初始化器且无法默认构造的 const成员,则该类的默认构造函数被定义为删除的。...使用 move的代码应该使用 std::move,而不是 move,这是因为具有转换为右值引用功能的函数就是标准库中的函数模板,而不使用 std,则可能引起潜在的名字冲突。

    1K50

    C++特性使用建议

    通常友元应该定义在同一文件内,避免代码读者跑到其它文件查找使用该私有成员的类。...某些情况下,相对于将类成员声明为 public,使用友元是更好的选择,尤其是如果你只允许另一个类访问该类的私有成员时。当然,大多数类都只应该通过其提供的公有成员进行互操作。...9.类型转换 不要使用 C 风格类型转换,而应该使用 C++ 风格的类型转换。 (1)用 static_cast 替代 C 风格的值转换,或某个类指针需要明确的向上转换为父类指针时。...如果不可避免的需要使用宏,为尽可能避免使用宏带来的问题,请遵守下面的约定: (1)不要在 .h 文件中定义宏。...(3)如果你使用模板编程,你必须考虑尽可能的把复杂度最小化,并且尽量不要让模板对外暴漏。你最好只在实现里面使用模板,然后给用户暴露的接口里面并不使用模板,这样能提高你的接口的可读性。

    1.9K30

    《C++Primer》第十八章 用于大型程序的工具

    如果异常发生在构造函数中,则当前的对象可能只构造了一部分(有些成员已经初始化了,另一些成员在异常发生前也许还没有初始化)。即使某个对象只构造了一部分,我们也要确保已构造的成员能被正确地销毁。...1.2 模板特例化 模板特例化必须定义在原始模板所属的命名空间中,和其他命名空间名字类似,只要我们在命名空间中声明了特例化,就能在命名空间外部定义它了: // 我们必须将模板特例化声明成std的成员 namespace...当一个类具有多个基类时,有可能出现派生类从两个或者多个基类中继承了同名成员的情况。此时不加前缀限定符直接使用该名字将引发二义性。...当然,继承体系中的每个类都可能在某个时刻成为“最底层的派生类”。只要我们能创建虚基类的派生类对象,该派生类的构造函数就必须初始化它的虚基类。...当我们创建一个Panda对象时,初始化顺序: 使用Panda的构造函数初始值列表中提供共的初始值构造虚基类ZooAnimal部分 接下来构造Bear部分 然后构造Raccoon部分 构造第三个直接基类

    1.4K20

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

    不过这个合成操作只有在构造函数真正被需要的时候才会发生; 如果一个类A含有多个成员类对象的话,那么类A的每一个构造函数必须调用每一个成员对象的默认构造函数而且必须按照类对象在类A中的声明顺序进行; 2)...所以,当编译器只看到模板的声明时,它不能实例化该模板,只能创建一个具有外部连接的符号并期待连接器能够将符号的地址决议出来。...,该指针是在构造函数中初始化的,所以没有构造函数的话该指针无法被初始化; 4) 带有一个虚基类的类 还有一点需要注意的是: 1) 并不是任何没有构造函数的类都会合成一个构造函数 2) 编译器合成出来的构造函数并不会显示设定类内的每一个成员变量...既然是虚函数,它的函数指针会被存在虚函数表中,由于纯虚函数并没有具体的函数体,因此它在虚函数表中的值就为0,而具有函数体的虚函数则是函数的具体地址。 一个类中如果有纯虚函数的话,称其为抽象类。...意思是右值引用类型的变量可能是左值也可能是右值 特点3:T&& t在发生自动类型推断的时候,它是左值还是右值取决于它的初始化。

    2.2K30
    领券