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

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

(1)不能再类声明中初始化 const数据成员,因为类的对象未被创建时,编译器不知道 SIZE的值是多少。...是 C++/C语言标准的库函数,对于非内部数据类型的对象而言,它无法满足动态对象的要求,对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数,库函数不在编译器控制的权限之内,不能执行构造和析构...并且,类的构造函数需要重载,C++规定构造函数于类同名,只有一个名字,如果想用几种不同的方法创建对象,只能用重载机制来实现,所以类可以有多个同名的构造函数。...辨识重载:靠参数而不是返回值的不同来区分重载函数,编译器根据参数为每个重载函数产生不同的内部标识符号。 extern "C"的用处 如果C++程序要调用已经被编译后的C函数,我?...{ m_a = a; … } 注意:成员对象初始化的次序完全不受他们再初始化表中的次序的影响,只由成员对象在类中声明的次序决定,因为类的声明是唯一的,而类的构造函数可以有多个,因此会有不同次序的初始化表

1.6K20

面试总结-C++

起到了隐藏的作用 在类的 static 成员变量属于整个类所拥有,对类的所以对象只有一份拷贝 在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的 static...中的static关键字的总结 几个复制的声明 void * ( * (*fp1)(int))[10]; //fp1是一个指针,指向一个函数,函数参数为int,函数返回参数是一个指针,指针指向一个数组,...见为什么不能建立引用数组 将引用作为函数的参数时,可以避免对变量或者对象的复制,因此不会调用对象的拷贝构造函数。当不希望传入的引用参数不被改变时,使用const引用。...而对于析构函数来说,又必须是虚函数,因为只有先从子类对象进行销毁,才能保证资源不泄露。 在构造函数和析构函数中都不要调用虚函数也是这个道理。...在Linux中以.a结尾 动态库(共享库)的代码在可执行程序运行时才载入内存,在编译过程中仅简单的引用,因此代码体积比较小,在程序运行时还需要动态库存在。

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

    C++11 语法特性:auto 与范围 for 循环详解

    1.1 auto 的基本用法与特性 auto 允许编译器在变量初始化时推导变量的类型,避免手动书写复杂的类型声明。 当声明指针或引用时,必须显式加上 * 或 &,以表示指针或引用类型。...auto 不能直接用作函数参数类型,但可以用于函数返回值类型。 声明多个变量时,所有变量必须是相同的类型,编译器只会推导第一个变量的类型。 auto 不能用于数组的声明。...2.1 范围 for 循环的基本语法 范围 for 循环的基本语法如下: for (元素声明 : 容器或数组) { // 循环体 } 在这个语法中,元素声明 用于声明每次循环的元素,容器或数组...拷贝构造函数:分配新内存,并将原对象的内容复制到新内存中。 赋值运算符重载:释放旧的内存,分配新内存,并将原对象的内容复制到新内存中。 析构函数:在对象销毁时,释放动态分配的内存,避免内存泄漏。...如果一个类没有涉及到资源管理,或者只使用了栈上的数据(不涉及动态内存),可以不必显式定义五法则。 在 C++ 中,当一个类管理动态资源时,遵循三法则或五法则是确保资源被正确管理的关键。

    20210

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

    析构函数可以为 virtual 型,构造函数则不能,为什么? 构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。不建议在构造函数和析构函数里面调用虚函数。...派生类的构造函数中,编译器会加入构造基类的代码,如果基类的构造函数用到参数,则派生类在其构造函 数的初始化列表中必须为基类给出参数,就是这个原因。...(动态绑定是根据对象的动态类型而不是函数名,在调用构造函数之前,这个对象根本就不存在,它怎么动态绑定?) C++中空类默认产生哪些类成员函数?...因为const对象或引用类型只能初始化,不能对他们赋值。 C++中有那些情况只能用初始化列表,而不能用赋值?...在C++语言中,赋值与初始化列表的原理不一样,赋值是删除原值,赋予新值,初始化列表开辟空间和初始化是同时完成的,直接给予一个值 所以,在C++中,赋值与初始化列表的使用情况也不一样,只能用初始化列表,而不能用赋值的情况一般有以下

    1.6K11

    C++笔试面试题整理

    C++中,虚函数,抽象基类,动态绑定和多态构成了出色的动态特性。 对象在内存中是怎么存放的?...给你一个指针,并用new动态申请空间,在另一个函数中释放,不知道是申请的一个元素还是一个数组的情况下,怎么确定用delete还是delete []?...有哪几种情况只能用初始化列表,而不能用赋值? 当类中含有const、引用成员变量以及基类的构造函数都需要初始化列表。 虚函数是怎么实现的? 简单地说,虚函数是通过虚函数表实现的。...C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式--面向对象编程、泛型编程和过程化编程。...对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。

    2.6K40

    聊聊结构化绑定

    所有非静态数据成员都必须是public访问属性,全部在E中,或全部在E的一个基类中(即不能分散在多个类中)。identifier-list按照类中非静态数据成员的声明顺序绑定,数量相等。...name是一个C风格字符串,它大概是从C代码继承来的,我希望客户能用上C++风格的std::string;score属于Transcript类型,表示学生的成绩单,这个结构比较大,我希望能传递const...也就是说,方括号前面的修饰符都是作用于e的,而不是那些新声明的变量。至于为什么第一条会独立出来,这是因为在标准C++中第二条的形式不能用于数组拷贝。...至此,我想“结构化绑定”的意义已经明确了:标识符总是绑定一个对象,该对象是另一个对象的成员(或数组元素),后者或是拷贝或是引用(引用不是对象,意会即可)。...延伸 C++17的新特性不是孤立的,与结构化绑定相关的有: •类模板参数推导(class template argument deduction,CTAD),由构造函数参数推导类模板参数;•拷贝省略(copy

    32910

    再探虚函数

    函数模板的使用 动态多态 在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据所指对象的实际类型来调用相应的函数,如果对象类型是派生类,就调用派生类的函数,如果对象类型是基类,...2、纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加"=0" 3、声明了纯虚函数的类是一个抽象类。...那我现在有一个抽象类的对象,我要调用接口,调用哪个? ---- Q5:基类的析构函数为什么要定义成虚函数?...因为父类对象会在子类之前进行构造,此时子类部分的数据成员还未初始化,因此调用子类的虚函数时不安全的,故而C++不会进行动态联编; 析构函数是用来销毁一个对象的,在销毁一个对象时,先调用子类的析构函数,然后再调用基类的析构函数...vptr是一个指针,在类的构造函数中创建生成,并且只能用this指针来访问它,因为它是类的一个成员,并且vptr指向保存虚函数地址的vtable.对于静态成员函数,它没有this指针,所以无法访问vptr

    87620

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

    不过这个合成操作只有在构造函数真正被需要的时候才会发生; 如果一个类A含有多个成员类对象的话,那么类A的每一个构造函数必须调用每一个成员对象的默认构造函数而且必须按照类对象在类A中的声明顺序进行; 2)...在C/C++中,对函数参数的扫描是从后向前的。...如果是指函数的声明和定义 声明:一般在头文件里,对编译器说:这里我有一个函数叫function() 让编译器知道这个函数的存在。 定义:一般在源文件里,具体就是函数的实现过程 写明函数体。...参数的含义是程序在命令行下运行的时候,需要输入argc 个参数,每个参数是以char 类型输入的,依次存在数组里面,数组是 argv[],所有的参数在指针 char * 指向的内存中,数组的中元素的个数为...说说 1) 有时候我们会遇到这样一种情况,我们用对象a初始化对象b后对象a我们就不在使用了,但是对象a的空间还在呀(在析构之前),既然拷贝构造函数,实际上就是把a对象的内容复制一份到b中,那么为什么我们不能直接使用

    2.2K30

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

    ,而它拥有一组参数时; 2) 成员初始化列表做了什么 ① 编译器会一一操作初始化列表,以适当的顺序在构造函数之内安插初始化操作,并且在任何显示用户代码之前; ② list中的项目顺序是由类中的成员声明顺序决定的...规则,只要你一实例化对象,系统自动回调用一个构造函数就是你不写,编译器也自动调用一次。...77、构造函数和析构函数可以调用虚函数吗,为什么 1) 在C++中,提倡不在构造函数和析构函数中调用虚函数; 2) 构造函数和析构函数调用虚函数时都不使用动态联编,如果在构造函数或析构函数中调用虚函数,...如果有多个成员类对象则构造函数的调用顺序是对象在类中被声明的顺序,而不是它们出现在成员初始化表中的顺序。 ③ 派生类构造函数。...而构造函数是在创建对象时自动调用的,不可能通过父类或者引用去调用,因此就规定构造函数不能是虚函数 (4)析构函数一般都要声明为虚函数,这个应该是老生常谈了,这里不再赘述 《为什么C++不能有虚构造函数,

    2.4K40

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

    前言 C++一直被称作永不过时的开发语言,游戏、服务器、人工智能等领域都必须用到他! 今天我整合了2021年100道大厂高频C++基础面试题,里面包含了C++很多基础知识点,干货满满。...因为sizeof值在编译时确定,所以不能用来得到动态分配(运行时分配)存储空间的大小。...内存泄漏一般是指堆内存的泄漏,也就是程序在运行过程中动态申请的内存空间不再使用后没有及时释放,导致那块内存不能被再次使用。 20、什么函数不能声明为虚函数?构造函数为什么不能为虚函数?...C++中,初始化时在执行相关代码时才会进行初始化,主要是由于C++引入对象后,要进行初始化必须执行相应构造函数和析构函数,在构造函数或析构函数中经常会需要进行某些程序中需要进行的特定操作,并非简单地分配内存...所以C++标准定为全局或静态对象是有首次用到时才会进行构造,并通过atexit()来管理。在程序结束,按照构造顺序反方向进行逐个析构。所以在C++中是可以使用变量对静态局部变量进行初始化的。

    2.2K20

    JAVA和C++对比学习

    ,以及足够简洁的makefile和安装脚本 2 语法特色 2.1 const C++独有,可以限定指针指向的对象不可变,同时也可以限定指针本身不可变,常用于函数参数的声明,减少修改输入参数的恶劣实践...如果有const修饰符就不需要靠人工来遵守了 2.2 默认参数 C++可以在声明函数时添加参数的默认值 JAVA没有办法添加默认值,只能通过方法重载,声明一堆不同参数数量的同名函数来实现 让用户可以用尽量少的参数来调用函数...C++变量类型长度不固定,有带符号和不带符号的区别 为了在32和64位机上通用,通常需要定义uint32_t之类的类型来统一长度 JAVA变量长度固定,全部都是带符号的 3.3 复合变量类型 C++...权限的内容 4.5 构造器 C++有初始化列表,可以在其中选择不同的基类构造函数 JAVA在子类构造器中假模假样的调用一下选择的基类构造器,实际上那行代码并非在那个时间被调用 JAVA缺乏明确的初始化个成员以及自己的语法...C++兼容C语言,windows和linux都是用C语言编写的软件,使用系统API时完全没有门槛 JAVA基本上只能用标准JDK来构造功能,另外也可以用JNI来引入本地(C语言编写)的代码 很多最时髦的操作系统功能

    2.7K40

    openFoam源码中的C++

    openFoam源码中涉及到的c++思想有很多,因为在计算流体力学中,域的创建尤为重要,我们可以在域中存储我们想要的物理变量如速度、压力等等。...这里explict的解释我总结如下: C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的 另一个关键字是implicit..., 意思是隐藏的,类构造函数默认情况下即声明为 implicit(隐式).explicit声明之后,外面调用该构造函数必须显式声明, 因为构造器若只有一个参数并且默认是implicit,在外面调用的时候可以直接等于...: 如果类的设计者不写复制构造函数, 编译器就会自动生成复制构造函数。...在.C文件中,我们也可以看见一些有意思的写法,比如说模板构造函数,成员变量的直接初始化等等: const char* const Foam::Field::typeName("Field")

    94430

    C++知识概要

    静态变量初始化 静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存。在 C++ 中,初始化是在执行相关代码时才会进行初始化。...为什么 C++空类的大小不为 0,不同编译器设置不一样,vs 设置为 1 C++标准指出,不允许一个对象(当然包括类对象)的大小为 0,不同的对象不能具有相同的地址 带有虚函数的 C++类大小不为...所有其他的非静态数据成员都不会被初始化 如何消除隐式转换 C++中提供了 explicit 关键字,在构造函数声明的时候加上 explicit 关键字,能够禁止隐式转换 如果构造函数只接受一个参数...,数组是 argv[],所有的参数在指针char * 指向的内存中,数组的中元素的个数为 argc 个,第一个参数为程序的名称。...为什么拷贝构造函数必须传引用不能传值 拷贝构造函数的作用就是用来复制对象的,在使用这个对象的实例来初始化这个对象的一个新的实例。

    1.1K20

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

    因为sizeof值在编译时确定,所以不能用来得到动态分配(运行时分配)存储空间的大小。...在构造时,根据对象的类型去初始化虚指针vptr,从而让vptr指向正确的虚表,从而在调用虚函数时,能找到正确的函数 (3)所谓的合适时机,在派生类定义对象时,程序运行会自动调用构造函数,在构造函数中创建虚表并对虚表初始化...在构造子类对象时,会先调用父类的构造函数,此时,编译器只“看到了”父类,并为父类对象初始化虚表指针,令它指向父类的虚表;当调用子类的构造函数时,为子类对象初始化虚表指针,令它指向子类的虚表 (4)当派生类对基类的虚函数没有重写时...《Effective C++》中所阐述的是:将构造函数和析构函数声明为inline是没有什么意义的,即编译器并不真正对声明为inline的构造和析构函数进行内联操作,因为编译器会在构造和析构函数中添加额外的操作.../ 49、C++的异常处理的方法 在程序执行过程中,由于程序员的疏忽或是系统资源紧张等因素都有可能导致异常,任何程序都无法保证绝对的稳定,常见的异常有: 数组下标越界 除法计算时除数为0 动态分配空间时空间不足

    2.6K40

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

    因为sizeof值在编译时确定,所以不能用来得到动态分配(运行时分配)存储空间的大小。...在构造时,根据对象的类型去初始化虚指针vptr,从而让vptr指向正确的虚表,从而在调用虚函数时,能找到正确的函数 (3)所谓的合适时机,在派生类定义对象时,程序运行会自动调用构造函数,在构造函数中创建虚表并对虚表初始化...在构造子类对象时,会先调用父类的构造函数,此时,编译器只“看到了”父类,并为父类对象初始化虚表指针,令它指向父类的虚表;当调用子类的构造函数时,为子类对象初始化虚表指针,令它指向子类的虚表 (4)当派生类对基类的虚函数没有重写时...《Effective C++》中所阐述的是:将构造函数和析构函数声明为inline是没有什么意义的,即编译器并不真正对声明为inline的构造和析构函数进行内联操作,因为编译器会在构造和析构函数中添加额外的操作.../ 49、C++的异常处理的方法 在程序执行过程中,由于程序员的疏忽或是系统资源紧张等因素都有可能导致异常,任何程序都无法保证绝对的稳定,常见的异常有: 数组下标越界 除法计算时除数为0 动态分配空间时空间不足

    2K10

    分享丨CC++内存管理详解--堆、栈

    全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。...delete[ ] p; } 但是注意:对于多数C++的实现,new[]操作符中的个数参数是数组的大小加上额外的存储对象数目的一些字节。在你的内存分配机制重要考虑的这一点。...对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。...这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。   如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。...对于非内部数据类型的对象而言,new在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数,那么new的语句也可以有多种形式。

    1.1K21

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

    大家好,又见面了,我是你们的朋友全栈君。 1. new、delete、malloc、free关系 malloc申请内存,free只会释放内存, new调用构造函数,delete会调用对象的析构函数。...对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。...从基类继承来的纯虚函数,在派生类中仍是虚函数。 抽象类中不仅包括纯虚函数,也可包括虚函数。抽象类必须用作派生其他类的基类,而不能用于直接创建对象实例。但仍可使用指向抽象类的指针支持运行时多态性。...,而在C++中,这些临时对象都是const类型的。...答案:当类中含有const、reference 成员变量;基类的构造函数都需要初始化表。 15. C++是不是类型安全的? 答案:不是。

    1.1K10

    CC++常见面试知识点总结附面试真题—-20220326更新

    静态成员变量需要在类内声明(加static),在类外初始化(不能加static),如下例所示; 2)....在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”?...类型名 (*数组标识符)[数组长度] 指针数组,在C语言和C++中,数组元素全为指针的数组称为指针数组,其中一维指针数组的定义形式如下。指针数组中每一个元素均为指针,其本质为数组。...只有当参数是当前类的引用时,才不会导致再次调用拷贝构造函数,这不仅是逻辑上的要求,也是 C++ 语法的要求。 2) 为什么是 const 引用呢?...,它的存中主要为了兼容C语言编译器,也就是说如果一个文件只包含C语言兼容库(不包含C++标准库),那么它在C语言编译器中依然可以编译通过。

    1.6K10

    类的成员函数总结

    无返回值 对象实例化时编译器自动调用对应的构造函数 构造函数可以重载 如果类中没有显示定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显示定义编译器将不再生成。...在创建对象时,编译器通过调用构造函数,给对象中的各个成员变量一个合适的初始值。 虽然上述构造函数调用后,随想中已经有一个初始值,但是不能将其称为对对象中成员变量的初始化。...为什么不是两个1呢?因为初始化列表定义的顺序跟成员变量声明的顺序一致。在private中_a2是先声明,所以在初始化列表中先给_a2进行定义,因此就是随机值!!!...成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的顺序无关~ 二、析构函数: 1、概念 与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。...我们来分析一下,因为上面的函数是传值传参,而形参是实参的一份临时拷贝,所以本来st1中含有的_a空间,而st中也复制拷贝了一份,st中同样的_a也指向了相同动态开辟数组a的空间,而析构函数会自动清理动态开辟的空间

    6610
    领券