C++基础知识点

这篇博客详细讲解了C++的基础知识点,包括面向对象的编程思想、类的定义、对象的特征、头文件与实现文件的分离、内联函数、成员函数的this指针、编译器自动生成的缺省函数、拷贝构造函数的调用场景、构造函数的特性、静态成员的用途、常对象与常函数的概念,以及const和static的作用。此外,还讨论了对象间的数据共享、抽象类、运算符重载、流运算符、析构函数、友元、对象初始化顺序、多态、构造函数与析构函数的使用、堆栈与堆的区别、以及内存管理等相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.面向对象程序设计的思想是什么?

把数据结构和对数据结构进行操作的方法封装成一个个的对象。

2.什么是类?

把一些具有共性的对象归类后形成一个集合。

3.对象的两个特征及含义?

静态特征,对象表现出来的属性;动态特征,对象表现出来的方法。

4.头文件中声明类,对应实现文件中定义类的意义?

提高编译效率,分开的话只需要编译一次生成对应的.obj文件,再次应用该类的地方,这个类就不会被再次编译。

5.类的内联函数有什么属性?

在函数调用的地方在编译阶段都会进行代码替换。

6.成员函数通过什么来区分不同对象的成员数据?为什么它能够区分?

通过this指针来区分,因为它指向对象首地址。

7.C++编译器自动为类生成的缺省函数是什么?

默认构造函数,拷贝构造函数,析构函数,赋值函数。

8.拷贝构造函数在哪几种情况下会被调用?

(1)当类的一个对象去初始化类的另一个对象时

(2)函数的形参是类的对象,调用函数进行形参和实参结合时

(3)函数的返回值是类对象,函数调用完成返回时

9.构造函数与普通函数在形式上有什么不同?

构造函数名字必须与类名相同,没有类型,没有返回值,一般情况下,专门用来初始化对象成员变量

10.什么情况下必须重写拷贝构造函数?

当构造函数涉及动态分配内存空间时,必须重写拷贝构造函数,且必须是深拷贝

11.构造函数调用顺序?

基类构造函数,对象成员构造函数,派生类构造函数

12.哪些情况必须用到初始化成员列表?

类的成员包括常量,对象(且没有无参构造函数)或者引用

13.什么是常对象,常函数?

常对象是任何场合都不能对其成员对象的值进行修改的对象,常函数只能读取类数据,不能修改类数据,常对象只能调用常函数

14.const的作用?

(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了。

(2)欲阻止一个指针被改变,可以使用const关键字。被指定为const的指针为常量指针,被指定为const的指针所指数据为指针常量。

(3)const可用来修饰形参,表明它是一个输入参数,在函数内部不能改变其值。

(4)类中成员函数可被指定为常函数,不能修改类的成员变量。

(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使其返回值不为“左值”。

15.static的作用?

(1)函数体内static变量作用范围为该函数体,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。

(2)模块内的static变量作用范围为该模块,不能被模块外其他函数访问。

(3)模块内的static函数作用范围为该模块,只可被这一模块内的其他函数调用。

(4)类中static变量属于整个类所有,对类的所有对象只有一份拷贝,可以为public,protected或private;静态数据成员其实是类域中的全局变量,其定义不应放在头文件中,而应与全局变量定义相同,在源文件中定义;静态数据成员可以是所属类的数据类型,而普通数据成员则不可以,普通数据成员只能声明为所属类类型的指针或引用。

class base

{

public:

static base object1;//正确,静态数据成员

base object2;//错误

base * object3;//正确,指针

base & object4;//正确,引用

}

(5)类中static函数属于整个类所有,这个函数不接收this指针,因而只能访问类中static成员变量和static成员函数;可通过对象来引用类中非static成员变量。静态函数的意义在于静态私有成员在类外不能访问,可通过类的静态成员函数来访问;当类的构造函数是私有的时候,不能像普通类那样实例化自己,只能调用成员函数来调用构造函数。

16.对象间是怎样实现数据共享的?

通过类的静态成员变量来实现,静态成员变量占有自己独立的空间不为某个对象所私有。

17.在类外有什么办法来访问类的非共有成员?

友元,继承,共有成员函数

18.什么叫抽象类?

不用来定义对象而只做为一种基本类型用作被继承的类。

19.不允许重载的五个运算符?

成员指针   .*

长度运算符 sizeof()

域运算符   ::

成员访问符 .

条件运算符 ?:

20.运算符重载的三种方式?

普通函数(少见),友元函数,类成员函数

21.流运算符为什么不能通过类的成员函数重载,一般通过什么方式解决?

类的成员函数重载,运算符的第一个参数必须是自己,而对流运算符重载要求第一个参数是流对象。一般通过友元解决。

22.赋值运算符与拷贝构造函数的区别于联系?

联系:都是将一个对象拷贝到另一个中去。

区别:拷贝构造函数涉及到要新建立一个对象。

23.什么情况下调用类的析构函数?

对象生命周期结束时

24.友元关系的特性?

单向的,非传递的,不能继承

25.对象成员初始化的顺序是什么?

由成员对象在类中声明的顺序决定

26.类和对象之间的关系?

类是对象的抽象,对象是类的实例

27.类的成员的访问属性?

public/protectedd/private

28.父类写了一个virtual函数,如果子类覆盖它的函数不加virtual,能否实现多态?

能,virtual会被子类隐形继承

29.函数重载的含义?它与多态的区别?

函数重载是一个同名函数完成不同的功能,编译系统在编译阶段通过函数参数个数,参数类型及返回值来区分该调用哪一个函数,即实现的是静态的多态性。虚函数是在基类中通过使用关键字virtual来申明一个函数为虚函数,含义是该函数的功能可能在将来的派生类中定义或者在基类的基础上进行扩展,系统只能在运行阶段才能动态决定该调用哪一个函数,所以实现的是动态的多态性,它体现的是一个纵向的概念,也即在基类和派生类之间实现。

30.构造函数和析构函数能否被重载,为什么?

构造函数可以被重载,析构函数不可以被重载,构造函数可以有多个且可以有参数,而析构函数只能有一个,且不能带参数。

31.回调函数的定义及如何将类中成员函数定义为回调函数?

所谓回调函数,就是预先在系统中对函数进行注册,让系统知道这个函数的存在,以后,当某个时间发生时,再调用这个函数对事件进行相应。

在类的成员函数前加CALLBACK即将其定义为回调函数,函数的实现和普通函数没有区别。

32.虚函数是如何实现的?

通过虚函数表实现

33.抽象类不会产生实例,所以不需要构造函数?

错误,抽象类可以有构造函数,用来初始化抽象类的一些字段或执行其他与子类相关的代码

34.main函数执行以前还会执行什么代码?(操作)

全局对象的构造函数(设置栈指针;初始化static静态和global全局变量;将未初始化的全局变量赋初值;全局对象初始化;将main函数的参数,argc,argv等传递给main函数

35.从一个模板类可以派生新的模板类,也可以派生非模板类

36.当一个类A中没有生命任何一个成员变量与成员函数,这是sizeof(A)的值是多少?如果不是0,请解释一下编译器为什么没有让它为零?

不是零,反例:如果是0的话,声明一个class A[10]数组,而每一个占用的空间是0,就没办法区分A[0]和A[1]了

37.delete与delete[]的区别?

delete调用一次析构函数,而delete[]调用每一个对象的析构函数

38.子类析构时要调用父类的析构函数吗?

调用,析构函数的调用顺序是先派生类后基类,也就说在调用基类析构函数是,派生类的信息已经全部销毁了

39.继承的优缺点?

优点:

(1)继承是在编译时刻静态定义的,可以直接使用

(2)类继承可以较方便地改变父类的实现

(3)提高代码复用

缺点:

(1)因为继承在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现

(2)父类通常至少会定义子类的部分行为,父类的任何改变都可能改变子类的行为

(3)如果继承下来的实现不适合解决新的问题,则父类必须被重写或被其他类替换。这种依赖关系限制了灵活性并最终限制了复用性。

40.解释堆和栈的区别?

堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收

栈:由编译器自动分配释放,存放函数的参数值,局部变量的值等

41.一个类的构造函数和析构函数什么时候调用?是否需要手工调用?

创建类对象时调用构造函数,类对象生命期结束时调用析构函数,不需要手工调用,系统自动调用

42.何时需要预编译

总是使用不经常改动的大型代码体

程序由多个模块组成,所有模块都是用一组标准的包含文件和编译选项,在这种情况下,可以将所有包含文件预编译为一个预编译头

43.多态的作用

(1)隐藏实现细节,使得代码能够模块化,扩展代码模块,实现代码重用

(2)接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例某一属性时的正确调用

44.虚函数与普通函数的区别?内联函数与构造函数能否为虚函数?

虚函数有virtual关键字,有虚拟指针(虚函数的接口)和虚函数表,而普通函数没有

内联函数与构造函数不能为虚函数,构造函数不能为虚函数,而析构函数可以且常常是虚函数。

45.析构函数为什么要虚拟?

防止析构不彻底,造成内存泄漏

46.类中private成员变量可以由哪些函数访问?

类中成员函数与友元函数

47.private,protect,public三种访问类型的区别?

private是私有类型,只有本类中的成员函数访问;protect是保护类型,本类和继承类可以访问;public是公有类型,任何类都可以访问

48.类中成员变量如何初始化?

通过构造函数的初始化列表或者构造函数体实现

49.什么时候需要使用常引用

既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用

50.引用与指针有什么区别?

(1)引用必须被初始化,指针不必

(2)引用初始化后不能被改变,指针可以改变所指的对象

(3)不存在指向空值的引用,但是存在指向空值的指针

51.实时系统的基本特征?

在特定时间内完成特定任务的系统为实时系统,基本特征为实时性与可靠性

52.全局变量与局部变量在内存中有什么区别

全局变量储存在静态数据区,局部变量储存在堆栈中

53.堆栈溢出的原因

没有回收垃圾资源

54.多重继承的优缺点?

优点:可以调用多重接口,简单清晰利于复用

缺点:二义性(类名限定,同名覆盖)









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值