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

【笔记】《深入理解C++11》(上)

不但可以调用类的构造函数, 可以调用当前类的其他构造函数, 这样就能进一步减少重复代码 但要注意委派构造不能和普通的初始化列表共用, 因为目标构造(初始化列表)总是先于委派构造被调用, 这会导致目标构造的参数无效...右值引用形成的拷贝/赋值函数称为移动拷贝/赋值, 核心是直接窃走目标对象内部指针指向的内存内容, 然后置空目标对象的指针 无论声明了左值引用还是右值引用, 都必须在声明时立即初始化(参数列和初始化列表算立即初始化..., 如果定义了常量左值引用构造能正确执行, 只不过会变为拷贝形式 常量右值引用存在但是没有实际用途 std::move()能强制使一个左值变为右值, 但是不会改变其生命周期 右值引用本身是个左值,...(为了保证成员摆放的顺序一致) 派生类有非静态成员, 只有一个仅有静态成员类(为了保证类能被直接折叠, 因为C没有继承关系) 类有非静态成员, 派生类没有非静态成员(为了派生类折叠, 因为C...最终可以用is_pod::value直接判断是否POD 非受限联合 C++11后, 任何非引用类型都可以成为union的成员(包括函数), 因此称为非受限联合 不允许静态成员变量存在 union的一些默认函数将被删除

1.8K20

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

(UDT);C++中struct是抽象数据类型ADT),支持成员函数的定义,(C++中的struct能继承,能实现多态) C中struct是没有权限的设置的,且struct中只能是一些变量的集合体,可以封装数据却不可以隐藏数据...,而且成员不可以是函数 C++中,struct增加了访问权限,且可以和类一样有成员函数,成员默认访问说明符为public(为了与C兼容) struct作为类的一种特例是用来自定义数据结构的。...一个结构标记声明后,在C中必须在结构标记前加上struct,才能做结构类型名(除:typedef struct class{};);C++中结构体标记(结构体名)可以直接作为结构类型名使用,此外结构体...在实现多态,当用类操作派生类,在析构防止只析构类而不析构派生类的状况发生,要将类的析构函数声明为虚函数。...而当一个表达式涉及到类保护成员私有成员,宏就不能实现了。 40、构造函数、析构函数、虚函数可否声明为内联函数 首先,将这些函数声明为内联函数,在语法上没有错误。

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

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

(UDT);C++中struct是抽象数据类型ADT),支持成员函数的定义,(C++中的struct能继承,能实现多态) C中struct是没有权限的设置的,且struct中只能是一些变量的集合体,可以封装数据却不可以隐藏数据...,而且成员不可以是函数 C++中,struct增加了访问权限,且可以和类一样有成员函数,成员默认访问说明符为public(为了与C兼容) struct作为类的一种特例是用来自定义数据结构的。...一个结构标记声明后,在C中必须在结构标记前加上struct,才能做结构类型名(除:typedef struct class{};);C++中结构体标记(结构体名)可以直接作为结构类型名使用,此外结构体...在实现多态,当用类操作派生类,在析构防止只析构类而不析构派生类的状况发生,要将类的析构函数声明为虚函数。...而当一个表达式涉及到类保护成员私有成员,宏就不能实现了。 40、构造函数、析构函数、虚函数可否声明为内联函数 首先,将这些函数声明为内联函数,在语法上没有错误。

1.9K10

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

在以下场景中,经常需要显式引用 this 指针: 为实现对象的链式引用; 为避免对同一对象进行赋值操作; 在实现一些数据结构,如 list。...struct 作为数据结构实现体,它默认的数据访问控制是 public 的,而 class 作为对象的实现体,它默认的成员变量访问控制是 private 的。...引用折叠 X& &、X& &&、X&& & 可折叠成 X& X&& && 可折叠成 X&& 宏 宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”不是真的参数,在宏展开的时候对...有些场合必须要用初始化列表: 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 引用类型引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面 没有默认构造函数的类类型...,只是仅仅最多存在一份而已,并不是不在子类里面了);当虚继承的子类被当做父类继承,虚类指针会被继承。

4.9K41

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

在以下场景中,经常需要显式引用 this 指针: 为实现对象的链式引用; 为避免对同一对象进行赋值操作; 在实现一些数据结构,如 list。...struct 作为数据结构实现体,它默认的数据访问控制是 public 的,而 class 作为对象的实现体,它默认的成员变量访问控制是 private 的。...引用折叠 X& &、X& &&、X&& & 可折叠成 X& X&& && 可折叠成 X&& 宏 宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”不是真的参数,在宏展开的时候对...有些场合必须要用初始化列表: 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 引用类型引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面 没有默认构造函数的类类型...,只是仅仅最多存在一份而已,并不是不在子类里面了);当虚继承的子类被当做父类继承,虚类指针会被继承。

3.6K50

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

protected:保护继承,派生类继承类的保护成员,这些成员在派生类中变为保护私有的。...和 class 的区别 换个问法:说说C++结构体和C结构体的区别 struct默认为public类型,而class默认为private类型 struct只有public类型,而class支持public...编译区别:由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数一般只包括函数名。...内联函数和宏函数的区别 区别: 宏定义不是函数,无返回值、参数列表等。...移动语义(Move Semantics):移动语义允许将资源从一个对象移动到另一个对象,而不是进行昂贵的数据复制。

19110

C++关键知识点梳理

引用只能绑定在对象上,而不能与字面量或者某个表达式的计算结果绑定在一起;const 指针 & 引用函数指针:指向另一类型的对象,是对象不是别名,所以不需要定义初始化,但是未经初始化的指针容易引发运行时错误...左值引用&右值引用左值引用:常规引用,可支持取地址运算符&获取内存地址;右值引用:右值是临时对象、字面量等表达式,右值引用解决临时对象函数返回值给左值对象的深度拷贝;std::move:将输入的左值右值转换为右值引用类型的临终值...代码结构宏:一系列预定义规则,替换指定的文本模式,例如define PI 3.14,预处理,对宏定义替换展开;块:{}括号内由0条多条语句组成的序列;函数:函数是一个包含函数名、函数体、函数返回类型...例如:// 结构struct Car { string type, int tire_nums}5.类:类的基本思想是数据抽象和封装,抽象依赖于接口和动态实现的分离的编程。...()返回的内置指针,当智能指针引用计数为0,该内置指针将失效。

92630

C++面试知识总结

如果某个接口被实现被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。 2....编译器可以对const常量进行类型检查。而对宏定义只进行字符替换,没有类型安全检查,所以字符替换可能出错。 2.4 枚举和define的区别 #define 是在预编译阶段进行简单替换。...联合类型操作数的sizeof是其最大字节成员的字节数。 结构类型操作数的sizeof是这种类型对象的总字节数。 如果操作数是函数中的数组形参函数类型的形参,sizeof给出其指针的大小。...私有继承类的成员只能被直接派生类的成员访问,无法再往下继承。 受保护继承类的成员只被直接派生类的成员访问,无法再往下继承。...因为static成员不是任何对象的组成部分,所以static成员函数不能被声明为const。 static成员函数不能被声明为虚函数。

1.7K41

C++面试题

6、静态方法不能被重写为非静态的方法(会编译出错)。 重载的规则: 1、在使用重载只能通过相同的方法名、不同的参数形式实现。...构造函数不需要是虚函数,不允许是虚函数,因为创建一个对象我们总是要明确指定对象的类型,尽管我们可能通过实验室的类的指针引用去访问它但析构却不一定,我们往往通过类的指针来销毁对象。...当编译器为这个构造函数产生代码,它是为这个类的构造函数产生代码——既不是类,不是为它的派生类(因为类不知道谁继承它)。所以它使用的VPTR必须是对于这个类的VTABLE。...字节对齐与具体编译器相关,但一般都遵循以下三条规则: 1) 结构联合类的数据成员,第一个相对于首地址放在偏移为0的地方; 2) 结构联合类的各成员相对于首地址的偏移量,都是#pragma pack...如有需要编译器会在成员之间加上填充字节; 3) 结构联合类的总大小为最宽基本类型成员大小与#pragma pack指定的数值中较小那个的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

1.7K42

Visual C++ 中的重大更改

根据标准,可变说明符仅可应用于类数据成员的名称,不能应用于声明为 const static 的名称,不能应用于引用成员。...如果使用此选项,则不存在两个参数的 delete 函数,并且不会导致与 placement delete 运算符发生冲突。  联合数据成员 联合数据成员不再具有引用类型。...:非法的联合成员类型“int &”为引用类型           若要解决此问题,请将引用类型更改为指针值。...S() {}  }; union { struct { S s; }; } u;            具有匿名结构联合 为了符合标准,已正对联合中的匿名结构成员更改了运行时行为。...创建此类联合时,将不再隐式调用联合中的匿名结构成员的构造函数。 此外,联合超出范围,不再隐式调用联合中的匿名结构成员的析构函数。

5.1K10

Visual C++ 中的重大更改

根据标准,可变说明符仅可应用于类数据成员的名称,不能应用于声明为 const static 的名称,不能应用于引用成员。...如果使用此选项,则不存在两个参数的 delete 函数,并且不会导致与 placement delete 运算符发生冲突。  联合数据成员 联合数据成员不再具有引用类型。...:非法的联合成员类型“int &”为引用类型           若要解决此问题,请将引用类型更改为指针值。...S() {}  }; union { struct { S s; }; } u;            具有匿名结构联合 为了符合标准,已正对联合中的匿名结构成员更改了运行时行为。...创建此类联合时,将不再隐式调用联合中的匿名结构成员的构造函数。 此外,联合超出范围,不再隐式调用联合中的匿名结构成员的析构函数。

4.7K00

后台开发:核心技术与应用实践 -- C++

在调用函数,系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。...结构体的声明方法如下所示: struct 结构名{ 数据类型 成员名; 数据类型 成员名; ... } 共用体,用关键字 union 来定义,它是一种特殊的类,一个共用体里可以定义多种不同的数据类型...枚举的声明方式为: enum 枚举类型名{枚举常量表列}; 如同结构和共用体一样,枚举变量可用不同的方式说明,即先定义后说明,同时定义说明直接说明 设有变 a,b,c 是枚举类型 weekday,...在C语言中, struct 中不能定义成员函数,而在 C++ 中,增加 class 类型后 ,扩展了 struct 的功能,struct能定义成员函数了。...而 虚函数 的作用是允许在派生类中重新定义与类同名的函数,并且可以通过类指针引用来访问类和派生类中的同名函数。

1.3K10

第 15 章 面向对象程序设计

正是因为在派生类对象中含有与其类对应的组成部分,所以能把派生类的对象当成类对象来使用,因此能将类的指针引用绑定到派生类对象中的类部分上。这种转换叫做派生类到类的类型转换。...动态类型:变量表达式表示的内存中的对象的类型,直到运行时才可知。如果表达式既不是引用不是指针,则它的动态类型永远与静态类型一致。...引用指针的静态类型与动态类型不同这一事实是 C++语言支持多态性的根本所在。而对于非虚函数的调用是在编译进行绑定。类似的,通过对象进行的函数(虚函数非虚函数)调用在编译绑定。...而对于派生类中覆盖的虚函数,其形参必须相同,返回类型也要与类匹配。而当虚函数的返回类型是类本身的指针引用且可进行类型转换,也是允许的。 ?...名字查找先于类型检查,对于派生类和类中的某个同名成员,即使派生类和成员的形参列表不一致,派生类成员还是会隐藏成员

1K30

基础知识_Cpp

什么是虚函数,实现原理是什么? 2.3. 面向对象三大特性 2.4. 编译多态是怎样的 2.5. 类成员的权限控制 2.6. struct和class的区别 2.7....C++中的static关键字的总结 const关键字 特性:(1)被修饰的对象不是常量,是一个只读变量(不能放在case关键字后面说明const不是一个常量);(2)定义赋值,之后不允许修改。...2.结构体的对齐规则:偏移地址需要是min(“默认对齐字节”,结构体内最宽成员)的整数倍。 3.结构体总大小:内部最宽基本类型的整数倍。...用于类层次结构类和派生类之间指针引用的转换 // 上行转换(派生类---->类)是安全的 CDerived *tCDerived1 = nullptr; CBase *tCBase1 = static_cast...(引用类型之间的转换。

1.9K30

CC++ 技术面试基础知识总结

在以下场景中,经常需要显式引用 this 指针: 为实现对象的链式引用; 为避免对同一对象进行赋值操作; 在实现一些数据结构,如 list。...联合有如下特点: 默认访问控制符为 public 可以含有构造函数、析构函数 不能含有引用类型成员 不能继承自其他类,不能作为类 不能含有虚函数 匿名 union 在定义所在作用域可直接访问 union...引用折叠 X& &、X& &&、X&& & 可折叠成 X& X&& && 可折叠成 X&& 宏 宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”不是真的参数,在宏展开的时候对...有些场合必须要用初始化列表: 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 引用类型引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面 没有默认构造函数的类类型...,只是仅仅最多存在一份而已,并不是不在子类里面了);当虚继承的子类被当做父类继承,虚类指针会被继承。

1.6K20

C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

有了虚函数,类指针指向类对象就使用类的成员(包括成员函数和成员变量),指向派生类对象就使用派生类的成员,从而实现多态。...系统分配给union的内存size就是size最大的成员所需空间大小,struct在分配空间,根据成员类型不同,会存在字节对齐情况,具体对齐标准和机器有关,可能是4字节8字节等对齐方式。...在任何同一刻,union值存放了一个被先选中的成员,而结构struct的所有成员都存在。 27、什么是野指针和悬空指针?...再free一次,由于堆中的内容已经是无效的东西,所以就会出错。 不过,有的编译器在free并没有清理堆中的内存,有时你对它free两次不一定出错。...将析构函数声明为虚函数,在实现多态,当用类操作派生类,在析构防止只析构类而不析构派生类的状况发生,要将类的析构函数声明为虚函数。

1.9K20

C++查缺补漏

; }; 使用前向引用声明虽然可以解决一些问题,但它并不是万能的 在提供一个完整的类声明之前,不能声明该类的对象,不能在内联成员函数中使用该类的对象 当使用前向引用声明时,只能使用被声明的符号,而不能涉及类的任何细节...复制构造函数只能接受一个参数,既用来初始化派生类定义的成员将被传递给类的复制构造函数 类的复制构造函数形参类型类对象的引用,实参可以是派生类对象的引用 例如: C::C(const C &...(::)来限定 如果从不同类继承了同名成员,但是在派生类中没有定义同名成员,“派生类对象名引用名.成员名”、“派生类指针->成员名”访问成员存在二义性问题 解决方式:用类名限定 虚类 需要解决的问题...建立对象所指定的类称为最远派生类 虚类的成员是由最远派生类的构造函数通过调用虚类的构造函数进行初始化的 在整个继承结构中,直接间接继承虚类的所有派生类,都必须在构造函数的成员初始化表中为虚类的构造函数列出参数...构造函数中为对象的虚指针赋值 通过多态类型的指针引用调用成员函数,通过虚指针找到虚表,进而找到所调用的虚函数的入口地址 通过该入口地址调用虚函数 class A{ public: virtual

2.5K10

当类构造与析构的时候...

,那么浅复制出来的对象会相应改变。...析构的时候,如果有类,且类的析构函数是虚函数,则先调用自己的构造函数,再调用类的构造函数。 如果类的析构函数不是虚函数,则调用类的析构函数。 ---- 继承机制中对象之间如何转换?...向上类型转换 将派生类指针引用转换为类的指针引用称为向上类型转换,向上类型转换会自动进行,而且向上类型转换是安全的。...向下类型转换 将类指针引用转换为派生类指针引用称为向下类型转换,向下类型转换不会自动进行,因为一个类对应几个派生类,所以向下类型转换不知道对应哪个派生类,所以在向下类型转换必须加动态类型识别技术...2、起一个类,将类的拷贝函数设为私有,在项目中比较优雅。 参考:muduo网络库源码实现

62120

嵌入式软件工程师笔试面试指南-CC++

C语言中 struct与 union的区别是什么? struct结构体)与 union(联合体)是C语言中两种不同的数据结构,两者都是常见的复合结构,其区别主要表现在以下两个方面。...结构体与联合体虽然都是由多个不同的数据类型成员组成的,但不同之处在于联合体中所有成员共用一块地址空间,即联合体只存放了一个被选中的成员,而结构体中所有成员占用空间是累加的,其所有成员都存在,不同成员会存放在不同的地址...在计算一个结构型变量的总长度,其内存空间大小等于所有成员长度之和(需要考虑字节对齐),而在联合体中,所有成员不能同时占用内存空间,它们不能同时存在,所以一个联合型变量的长度等于其最长的成员的长度。...头文件能加强类型安全检查。当某个接口被实现被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,大大减轻程序员调试、改错的负担。 在头文件中定义静态变量是否可行,为什么?...派生类在构造函数中要对自身成员初始化,也要对继承过来的成员进行初始化当类没有默认构造函数的时候,通过在派生类的构造函数初始化列表中调用类的构造函数实现

1.5K11
领券