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

CC++面试常问题集(2)

一,构造函数  构造方法用来初始化对象,与父类其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类构造方法)。...因此,在创建子类对象时,为了初始化从父类继承来数据成员,系统需要调用其父类构造方法。 二,析构函数  析构函数也不会被子类继承,只是在子类析构函数中会调用父类析构函数。...在C++,有五种函数不能被声明成函数,分别是:非成员函数、构造函数静态成员函数内联成员函数、友元函数这五种,下面分别解释为什么这五种函数不能被声明成函数。 1....内联成员函数  内联函数是为了在代码中直接展开,减少函数调用花费代价,并且inline函数在编译时被展开,函数是为了实现多态,是在运行时绑定。因此显然内联函数和多态特性相违背。 5....(3)指针常量本身(以p为例)允许寻址,即&p返回指针常量(常变量)本身地址,被引用对象用*p表示;引用变量本身(以r为例)不允许寻址,&r返回是被引用对象地址,而不是变量r地址(r地址由编译器掌握

1.1K10

C++关键知识点梳理

,未初始化变量含有一个不确定值,所以在定义变量时最好初始化,类成员使用初始化列表在构造函数初始化均是良好编程习惯;变量定义和声明:变量可以在多个文件中声明(external int i),但是只能在一个文件中被定义...内联函数(inline)适用于逻辑简单小代码块,编译器引用内联函数地方展开,节约了函数调用开销。...)手动分配和释放;栈(stack):编译器自动分配释放;全局区/静态区:全局变量静态变量存储是放在一块初始化全局变量静态变量在一块区域,未初始化全局变量和未初始化静态变量在相邻另一块区域...每个继承子类都有一个基类指针(占用一个指针存储空间,4字节)和基类表(不占用类对象存储空间)当派生类重新定义函数时,则将派生类函数地址添加到函数表中。...当一个基类指针指向一个派生类对象时,函数表指针指向派生类对象函数表。当调用函数时,由于派生类对象重写了派生类对应函数表项,基类在调用时会调用派生类函数,从而产生多态。

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

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

main函数执行之前,主要就是初始化系统相关资源: 设置栈指针 初始化静态static变量和global全局变量,即.data段内容 将未初始化部分全局变量赋初值:数值型short,int,long...,即大小是在编译时期确定,不必动态分配内存空间存储函数表,所以不在堆中 根据以上特征,函数表类似于类中静态成员变量.静态成员变量也是全局共享,大小确定,因此最有可能存在全局数据区,测试结果显示:...所有不加static全局变量函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在编译模块中使用 默认初始化为0,包括未初始化全局静态变量与局部静态变量,都存在全局未初始化静态变量函数内定义...如果析构函数不被声明成函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全,造成内存泄漏。...,在以前C语言中,全局变量静态变量又分为初始化和未初始化,在C++里面没有这个区分了,它们共同占用同一块内存区,在该区定义变量若没有初始化,则会被自动初始化,例如int型变量自动初始为0 常量存储区

2.5K40

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

main函数执行之前,主要就是初始化系统相关资源: 设置栈指针 初始化静态static变量和global全局变量,即.data段内容 将未初始化部分全局变量赋初值:数值型short,int,long...,即大小是在编译时期确定,不必动态分配内存空间存储函数表,所以不在堆中 根据以上特征,函数表类似于类中静态成员变量.静态成员变量也是全局共享,大小确定,因此最有可能存在全局数据区,测试结果显示:...所有不加static全局变量函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在编译模块中使用 默认初始化为0,包括未初始化全局静态变量与局部静态变量,都存在全局未初始化静态变量函数内定义...如果析构函数不被声明成函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全,造成内存泄漏。...返回值不要求 重写关系中,调用方法根据对象类型决定,重载根据调用时实参表与形参表对应关系来选择函数体 (3)隐藏(hide) 隐藏指的是某些情况下,派生类函数屏蔽了基类中同名函数,包括以下情况:

2K10

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

作用 修饰普通变量,修改变量存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。...函数局部变量分配内存空间; 将 inline 函数输入参数和返回值映射到调用方法局部变量空间中; 如果 inline 函数有多个返回点,将其转变为 inline 函数代码块末尾分支(使用...函数可以是内联函数内联是可以修饰函数,但是当函数表现多态性时候不能内联。...; shape2 = nullptr; return 0; } 析构函数 析构函数是为了解决基类指针指向派生类对象,并用基类指针删除派生类对象。...typeid typeid 运算符允许在运行时确定对象类型 type_id 返回一个 type_info 对象引用 如果想通过基类指针获得派生类数据类型,基类必须带有函数 只能获取对象实际类型

3.6K50

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

作用 修饰普通变量,修改变量存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。...函数局部变量分配内存空间; 将 inline 函数输入参数和返回值映射到调用方法局部变量空间中; 如果 inline 函数有多个返回点,将其转变为 inline 函数代码块末尾分支(使用...函数可以是内联函数内联是可以修饰函数,但是当函数表现多态性时候不能内联。...; shape2 = nullptr; return 0; } 析构函数 析构函数是为了解决基类指针指向派生类对象,并用基类指针删除派生类对象。...typeid typeid 运算符允许在运行时确定对象类型 type_id 返回一个 type_info 对象引用 如果想通过基类指针获得派生类数据类型,基类必须带有函数 只能获取对象实际类型

4.9K41

总结继承和多态一些问题

2.区分表和表指针生成阶段 表是在编译阶段就生成了,而表指针是在构造函数初始化列表阶段初始化。这也侧面回答了下一个问题。 3.构造函可以是函数吗?...不行,因为对象中函数表指针是在构造函数初始化列表阶段才初始化。 4.区分切片和派生类生成 先来说派生类生成步骤: ①先是继承了基类表,是把基类表拷贝下来了。...因此,简单总结就是:派生类对象赋值给基类对象,切片会把派生类中包含基类成员变量值拷贝过去,但是派生类表不会给拷贝过去,则函数中这个基类对象表是基类,所以无法实现多态。...内联函数可以写成函数,不过写出函数后,这个内联函数就不是内联函数了。 6.静态成员可以是函数吗?...不能,因为静态成员函数没有this指针,使用类型::成员函数调用方式无法访问函数表,所以静态成员函数无法放进函数表。 7.析构函数可以函数吗? 基类析构函数最好是函数

44220

《C++面向对象程序设计》✍千处细节、万字总结(建议收藏)「建议收藏」

调整基类成员在派生类访问属性其他方法 5.4 多继承 5.5 基类 5.6 赋值兼容规则 六、多态性与函数 6.1 多态性概述 6.2 函数 6.3 析构函数 6.4 纯函数 6.5...建立一个对象时,如果这个对象中含有从基类继承来成员,则基类成员是由最远派生类构造函数通过调用基类构造函数进行初始化。该派生类其他基类对基类构造函数调用都被自动忽略。...定义函数方法如下: virtual 返回类型 函数名(形参表) { 函数体 } 在基类中某个成员函数被声明为函数后,此函数就可以在一个或多个派生类中被重新定义。...函数必须是其所在类成员函数,而不能是友元函数,也不能是静态成员函数,因为函数调用要靠特定对象来决定该激活哪个函数内联函数不能是函数,因为内联函数是不能在运行中动态确定其位置。...即使函数在类内部定义,编译时仍将其看做非内联。 构造函数不能是函数,但是析构函数可以是函数,而且通常说明为函数。 ~ 在一个派生类中重新定义基类函数函数重载另一种形式。

3.2K40

C++ 面试必备:常见 C++ 面试题汇总及详细解析

当基类中某个函数派生类中被重新定义时,如果派生类对象调用该函数,则会覆盖掉基类中实现,执行派生类实现代码。在进行对象多态性转换时,重写非常重要。...内联函数和普通函数有什么区别? 内联函数和普通函数区别在于是否进行了“内联优化”。内联函数是一种特殊函数,编译器会在编译时将其整个函数体插入到调用该函数地方,从而节省了函数调用开销。...基类析构函数为何要声明为函数? C++基类析构函数声明为函数是为了确保在通过基类指针或引用删除派生类对象时,可以正确地释放派生类对象所占用内存。...此时,程序会为函数创建一个新栈帧,用于存储函数局部变量返回值等信息。栈帧包含了多个部分,例如函数参数、局部变量返回地址等等。函数参数通过栈传递,在栈顶部。局部变量则被分配在栈帧底部。...内存分配方式不同:malloc只负责分配内存空间,并返回该内存空间起始地址,但不会进行初始化。而new除了分配内存空间外,还会自动调用构造函数对对象进行初始化

1.9K30

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

有了函数,基类指针指向基类对象时就使用基类成员(包括成员函数和成员变量),指向派生类对象时就使用派生类成员,从而实现多态。...默认初始化为0,包括未初始化全局静态变量与局部静态变量,都存在全局未初始化区。...普通函数(非成员函数)、构造函数、友元函数静态成员函数内联成员函数。...如果析构函数不被声明成函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全,造成内存泄漏。...重载则要求参数列表不同,返回值不要求 重写关系中,调用方法根据对象类型决定,重载根据调用时实参表与形参表对应关系来选择函数体 隐藏(hide): 隐藏指的是某些情况下,派生类函数屏蔽了基类中同名函数

1.9K20

C++基础知识精髓

静态成员变量只能被初始化一次,不要在头文件中定义,为了避免重复定义。...不要在构造函数中定义(构造函数可能被调用多次)另外是因为类声明不分配内存空间.静态成员变量初始化方式:int Person::m_var = 10;静态成员变量只在静态存储区保留一份拷贝,静态成员变量可以声明为本来类类型...3.构造函数可以重载 4.构造函数初始化可以使用初始化参数列表,成员变量初始化顺序跟初始化列表顺序无关,是按照成员变量声明顺序。...5.什么时候一定要用初始化列表 有const成员变量和引用成员变量时候一定要用初始化列表初始化这两种变量 析构函数 没有返回值,析构函数名称类型前加~ 1.如果是栈对象 作用域结束时候自动调用析构函数...函数 什么是函数 简单地说,就是在成员函数前加关键字virtual,这样这个成员函数就变成了函数函数允许派生类取代基类所提供实现。

2K50

C++学习知识点

OOP面向对象程序设计多态理解 答:多态:同一操作作用于不同对象,可以有不同解释,产生不同执行结果。在运行时,可以通过指向基类指针,来调用实现派生类方法。...内联函数 答:作用:提高程序运行时调用函数效率。 用法:用关键字inline修饰,而内联函数在调用时,是将调用表达式用内联函数体来替换,类似于宏定义。...(3)尽量将基类析构函数定义为函数,当利用delete删除一个指向派生类定义对象指针时,系统会调用相应析构函数。而不将析构函数定义为函数时,只调用基类析构函数。...实现多态性,通过指向派生类基类指针,访问派生类中同名重定义成员函数。 9....当基类以函数参数形式存在,调用函数时,在编译时候不能静态映射到函数代码,因为此时不知道是调用基类函数还是子类函数,这是就需要发生动态联编。

1.7K20

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

static第二个作用是保持变量内容持久。存储在静态数据区变量会在程序刚开始运行时就完成初始化,也是唯一一次初始化。...static第三个作用是默认初始化为0.和全局变量一样存储在静态数据区。 说说静态变量什么时候初始化? 对于C语言全局和静态变量初始化发生在代码执行之前,属于编译期初始化。...静态全局变量 :全局作用域+文件作用域,所以无法在其他文件中使用。 局部变量:局部作用域,比如函数参数,函数局部变量等等。 静态局部变量 :局部作用域,只被初始化一次,直到程序结束。...内联函数和宏函数区别 区别: 宏定义不是函数,无返回值、参数列表等。...而内联函数本质上是一个函数,比如有返回值、参数列表等 宏函数是在预编译期做简单字符串替换 ;而内联函数则是在编译期进行代码插入 宏定义是没有类型检查,无论对还是错都是直接替换;而内联函数在编译时候会进行类型检查

20710

C++基础——函数

,则在派生类中,该方法仍为方法。...在使用时,定义基类类型指针,使其指向派生类对象,使用该指针调用某个方法,若该方法未被声明为函数,则调用是指针类中方法,若该方法函数,则调用是指针指向对象类中方法。...函数使用原则: 1)当类不会用作基类时,成员函数不要声明为virtual 2)当成员函数不重新定义基类方法,成员函数不要声明为virtual inline内联函数   内联函数由 编译器处理,直接将编译后函数体插入调用地方...,内联函数相对于普通函数优势只是省去了函数调用时压栈,跳转和返回开销。...静态成员函数   静态成员函数数添加关键字static,类静态成员(变量方法)属于类本身,在类加载时候就会分配内存,可以通过类名直接去访问;非静态成员(变量方法)属于类对象,所以只有在类对象产生

60640

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

静态变量只在初次调用时初始化,static size_t ctr=0只执行一次。 内联函数避免函数调用开销:编译时展开为函数体中表达式,免去函数调用寄存器保存恢复、复制实参跳转等。...内联函数定义在头文件。编译器将类内定义成员函数当做内联函数。 每个成员函数都有一个隐含this指针。...}】 virtual函数是基类希望派生类重新定义函数,希望派生类继承函数不能为函数。...根类一般要定义析构函数派生类只能通过派生类对象访问protected成员,不能用基类对象访问。基类定义为virtual就一直为函数派生类写不写virtual都是函数。...用做基类类必须是已定义。 存在函数+指针或引用==产生多态。非虚函数编译时就按指针或引用或对象类型确定。可以使用域操作符强制调用基类函数中调】。基类函数派生类默认实参要一致。

1.4K20

【笔记】《C++Primer》—— 第18章:用于大型程序工具

引入了内联命名空间,特点是内联空间名字可以被外侧直接使用无需特指,方法是在定义命名空间前面加上inline类似内联成员定义法,inline必须出现在命名空间第一次定义地方,后续则可写可不写 内联命名空间一般用在例如双版本代码共存时候...,将旧版本代码放在命名空间中,新版本则内联,这样容易切换所需版本 如果namespace后面不加名字直接定义命名空间的话,此时称为未命名命名空间,在这里面定义变量静态生命周期,在第一次使用时创建...,这都可能引起混乱 18.3 多重继承与继承 C++支持多重继承(很多其他语言不支持这一特性),方法就是继承列表多些几个基类,因此我们可以从多个直接基类产生派生类,这个派生类会继承所有父类属性...但是如果两个直接基类都继承了基类同一个对象,任何派生类再继承这两个基类,那么调用这个对象时会产生歧义因为这个对象被两个类重新继承了,最好解决方法仍然是在派生类中再继承一次对象指明好对象来源 在派生中...,基类是从最底层派生类开始初始化,也就是由最先一个派生汇合处类开始初始化,此时即使这个类不是基类直接派生也可以初始化基类实例 而且编译器是先按顺序初始化所有的基类,然后再按顺序初始化非虚基类

95720

【C++】C++ 引用详解 ④ ( 函数返回 静态变量 全局变量 引用 指针 )

一、函数返回 静态变量 / 全局变量 引用 / 指针 1、函数返回局部变量引用或指针无意义 上一篇博客 【C++】C++ 引用详解 ③ ( 函数返回值不能是 “ 局部变量引用或指针 | 函数..., 相应 局部变量 地址 也有没有了意义 , 此时 , 再持有一个 函数返回 没有意义 引用 / 指针 , 取出值是随机无意义值 ; 2、函数返回静态变量/全局变量引用或指针 函数 返回是..." 静态变量 " 或 " 全局变量 " 引用 / 指针 时 , 是可以 ; 如果 函数 返回值 是 静态变量 或 全局变量 引用 , 这两种变量 一旦分配内存后 , 在整个程序生命周期中..., 该内存都不会被回收 , 返回它们 引用 / 指针 , 可以正常访问 对应 内存中数据 ; 3、代码示例 - 函数返回静态变量/全局变量引用或指针 在下面的代码中 , fun 函数作为 参照..., 返回普通 静态变量 ; fun2 函数 返回 静态变量 引用 ; 上述两个函数 静态变量 生命周期 都是 与 程序生命周期相同 , 只有程序结束时 , 这两个 静态变量内存才会被回收

19330

硬核 | C++ 基础大全

全局/静态存储区:分为初始化和未初始化两个相邻区域,存储初始化和未初始化全局变量静态变量。 常量存储区:存储常量,一般不允许修改。 代码区:存放程序二进制代码。...当我们定义一个派生类对象时,编译器检测该类型有函数,所以为这个派生类对象生成一个函数指针,指向该类型函数表,这个函数指针初始化是在构造函数中完成。...因为一个基类指针指向一个派生类对象,在派生类对象中针对函数参数缺省值进行了重定义, 但是缺省参数值是静态绑定静态绑定绑定静态类型相关内容,所以会出现一种派生类函数实现方式结合了基类缺省参数值调用效果...哪些函数不能是函数 构造函数,构造函数初始化对象,派生类必须知道基类函数干了什么,才能进行构造;当有函数时,每一个类有一个表,每一个对象有一个表指针,表指针在构造函数初始化内联函数内联函数表示在编译阶段进行函数替换操作...,而函数意味着在运行期间进行类型确定,所以内联函数不能是函数静态函数静态函数不属于对象属于类,静态成员函数没有this指针,因此静态函数设置为函数没有任何意义。

1.2K10

【C++】自学终极笔记

用户提供则系统不再默认提供】 对于无参构造函数创建 Tdate today;//ok Tdate today();//error 对于静态成员变量,只能在类内声明,类外初始化 #include <iostream...}; // 静态成员变量定义和初始化 int MyClass::staticVar = 42; int main() { // 调用静态成员函数 MyClass::staticFunction...//显式重写则是 void display() const override { // 派生类函数实现 //... } }; 函数不能是静态成员函数内联函数...函数调度机制是通过对象函数表(vtable)来实现,而静态成员函数不属于对象实例,因此不能是函数。 构造函数不能是函数: 构造函数不能是函数。...这确保在使用基类指针指向派生类对象时,可以正确调用派生类析构函数,避免内存泄漏。 纯函数: 纯函数本身在基类中没有具体实现,而是在派生类中被强制要求实现。

17510

C++重要知识点小结---1

另外有几点需要注意:   第一、结构或者类中静态成员不对结构或者类大小产生影响,因为静态变量存储位置与结构或者类实例地址无关。   ...第二、没有成员变量结构或类(非虚)大小为1,因为必须保证结构或类每一个实例在内存中都有唯一地址。   第三、包含函数类或者继承类,需要算上表指针4个字节。   ...编译时就能确定哪个重载函数被调用,称为先期联编。 多态性可可以简单概括为“一个借口,多种方法”,在程序运行过程中才决定调用函数函数就是允许被其子类重新定义成员函数。...设置函数,需注意下列事项: 只有类成员函数才能说明为函数。这是因为函数仅适用于有继承关系类对象,所以普通函数不能说明为函数静态成员函数不能是函数,因为静态成员函数不受限于某个对象。...内联函数不能是函数,因为内联函数是不能在运行中动态确定其位置。即使函数在类内部定义,编译时,仍将其看作非内联。 构造函数不能是函数,因为构造时,对象还是一片未定型空间。

75891
领券