欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

程序开发之C++语言基础

程序员文章站 2023-04-02 15:24:12
1、C语言与C++语言的区别? C语言是面相过程的语言,而C++是面相对象的程序设计语言。 2、解释类和对象的关系,并举例说明 类是对象的类型,对象是类的具体实例。如学生就是...

1、C语言与C++语言的区别?

C语言是面相过程的语言,而C++是面相对象的程序设计语言。

2、解释类和对象的关系,并举例说明

类是对象的类型,对象是类的具体实例。如学生就是一个类型,而学生张三就是一个具体的对象。

3、一个类由几部分成员构成?

成员变量和成员函数

4、构造函数有什么作用?

构造对象时对对象初始化

5、简述构造函数的特点?

-1必须公有

-2构造函数名和类名一致

-3无返回值

-4构造函数可以接受参数用来初始化类的数据成员

6、什么是默认构造函数?

默认构造函数分两种:1构造函数不带参数;2构造函数带参数但参数都有默认值。

7、程序员在定义类时是否必须写一个构造函数,为什么?

不是必须,如果程序员一个构造函数都没写,编译器将提供一个空的默认构造函数,他不会对数据成员进行初始化。一旦程序员提供了构造函数,编译器将不提供默认构造函数。

8、什么是函数重载,并举例说明?

-1参数列表不同(a参数个数不同;b参数类型不同)

-2仅仅返回值不同不能算函数重载。

eg:Thing();

Thing(int a);

Thing(int a, int b);

9、什么是初始化列表,有什么作用,什么情况下必须使用初始化列表?

在构造函数的函数头,对类的成员变量进行初始化。

初始化列表优势:1效率高;2有一些类型的成员变量,只能使用初始化列表的方式初始化,如const,引用

10、设么是const成员函数,他有什么作用,通常情况下那些函数会是const成员函数?

const成员函数:函数体内,不能别改这个类的成员变量的值。

void printPoint()const;一般用于print,get等函数。

作用:增加程序的健壮性(鲁棒性)

11、析构函数有什么作用,析构函数在什么情况下会被调用?

析构函数用于释放对象所占用的资源空间,当一个对象被销毁时会自动调用析构函数。

12、一个类是否必须要定义一个析构函数,什么情况下必须要写析构函数?

如果类的成员时基本数据类型时则不需要写析构函数,但当类的成员有指针变量只想堆空间,即动态分配内存时,必须显示的销毁分配的对上的空间,用delete回收指针指向的内存空间。避免内存泄漏。

13、什么时浅拷贝?浅拷贝会产生什么问题?

可以把一个对象赋值给另一个对象,对象的每个成员的值,将一对一的拷贝到新的对象。这种拷贝叫逻辑拷贝,或浅拷贝。但是,如果对象含有指针成员变量,而指针变量又指向堆上空间,将只拷贝指针成员变量本身的值,造成两个对象的指针指向同一块对上的内存空间,删除对象时造成二次删除。

14、什么是函数链,使用函数链需要注意什么问题?

用一个函数调用另一个函数,如middle(p,q)。print();使用函数链时必须注意前一个函数的返回值必须是对象。

15、能否返回一个指向局部变量的指针或引用,为什么?

不能,局部变量在函数结束后自动被系统回收,那么指针将会变成野指针,引用将会变成无效引用,但值程序会有意想不到的结果发生。

16、Point middle(const Point & p1,const Point & p2);解释该函数的参数中加const和&的作用是什么?

加&的作用时为了避免拷贝,可与你节省内存空间,提高效率,加const时为了避免自函数体内修改形参的值。

17、什么时this指针,解释对象调用函数时传递参数的过程。

每个对象都隐式的包含了一个成员变量,名叫this。this是一个指针,指向对象自己。即this指针里保存的地址,就是对象自己在内存里的地址。

当一个类的对象调用成员函数时会默认将该对象传递给该函数,在函数体内不直接使用对象名,而是使用this指针,即this指针是指向该对象,指向调用者,谁调用该函数,this指针就指向谁。

18、静态局部变量和局部变量的区别,静态局部变量和静态全局变量的区别(生命周期和 作用范围分析)

局部变量存储在栈中,作用域为函数体内,生命周期:函数结束后被系统回收,

静态局部变量放在静态存储区,作用域为函数体内,生命周期:函数返回后,静态局部变量的内存空间不会被回收:当下一次调用函数时,静态局部变量依然保持上一次调用退出时的值。

静态全局变量也存储在静态存储区,作用域为从声明到整个文件结束,生命周期:整个程序运行期间。

19、简述类的普通成员变量和静态成员变量的区别。

某一个具体对象,对于非静态成员来说,每个对象都有一个特定值,每个对象都为自己都为自己的非静态成员,在内存里保留一个位置。而静态成员,整个类只有一份copy,不需要每个对象都保留一份copy,所有的对象都共享这块空间。

20、调用类的静态成员的两种方式是什么?

a、类名::静态成员名

b、对象.静态成员名

21、使用类的静态成员变量时需要注意什么问题。

类的静态成员变量要在类体之外(作用域::)进行初始化。

22、类的静态成员函数和普通成员函数的区别

类的静态成员函数,不能访问非静态成员变量和非静态成员函数。普通成员函数,既可以访问静态成员,也可以访问非静态成员。

23、友元函数有什么作用

友元函数可以访问类的私有成员。

24、使用友元函数的优缺点是什么?

友元可以改善性能,但是破环了封装。

25、什么是操作符重载?

用以存在的操作符其它类型的操作数(对象),称为操作符重载,操作符重载的目的就是让一些操作符可以直接操作对象。

26、为什么要实现两个版本的下标重载?

const对象只能调用const成员函数,故要实现const版本的下标重载,而非const版本的下标重载用于写操作。

27、简述浅拷贝与深拷贝的区别

浅拷贝指的是两个对象的指针成员指向同一块空间,而深拷贝是让两个对象的指针成员指向格子的空间。

28、赋值运算符重载的五步?

-避免自赋值,避免把一个对象赋值给它自己

-释放掉指针成员已经指向的内存,避免内存泄漏

-为指针成员开辟新内存空间

-内容本身的copy

-返回*this

29、简述C++中的继承

子类继承父类所有的成员,但不包括构造函数、析构函数和赋值运算符重载,子类继承父类后子类的成员有两部分:一是继承自父类的成员;二是子类自己扩展的成员。

30、C++de空类,编译器会默认提供哪些成员函数?

一个却生的构造函数、一个拷贝构造函数、一个析构函数、一个赋值运算符

31、C++中什么时候会调用拷贝构造函数?

通过拷贝一个已有对象,来创建一个新的对象。

-classT objet(another__object);把一存在的对象,作为新声明对象的构造函数的参数。

-classT object = another_object;声明一个对象,并用赋值表达式,用一个已有对象来初始化它。

-用传值的方式,从函数返回一个对象,也将调用拷贝构造函数。

32、子类继承父类后,子类的成员包括几部分?

子类继承父类后子类的成员有两部分,一是继承自父类的成员;二是子类自己扩展的成员。

33、什么是函数重写?

子类可以自己实现与父类成员函数原型相同(函数名、参数列表)的成员函数,称为重写。

34、子类重写父类的函数后,能否用子类对象调用到被覆盖的父类版本的函数?

可以,在子类中调用被覆盖的父类版本的函数时,在函数名前加 父类类名::

35、自类能否直接访问父类的“私有”成员,有几种方式可以访问到该“私有”成员?

-一是通过继承自父类的公有成员函数来访问继承自父类的私有成员

-二是将父类的私有成员改为protected成员

36、简述public、protected、private三种继承方式的区别。

-私有继承(private):子类中所有自称子父类的成员(包括成员变量、成员函数),都变成私有成员。

-保护继承(protected):继承自父类的public成员,变成子类的protected成员;而继承自父类的protected和private成员,访问权限保持不变。

-公有继承(public):所有继承自父类的成员,访问权限都保持不变。

37、类的成员函数中那些不能是虚函数?

静态成员函数,内联成员函数,构造函数

38、继承有什么好处,什么情况下会使用到继承?

-类之间有自然的继承关系

-代码复用

-使代码修改更容易,只需要修改父类,子类会随之改变。

39、两个类之间相互交互的方式有几种,分别是什么?

-继承

-组合类

40、简述把子类对象当做父类对象使用的三种情况

-把子类对象赋值给父类对象

-父类引用指向子类对象

-父类指针指向子类对象

41、能否把父类对象当做子类对象来使用,为什么?

不能,因为子类有自己扩展的成员。

42、什么是向下转型,什么情况下才能使用向下转型?

把一个实际指向子类的父类指针,显示的转型成子类指针,就可以通过这个子类指针,调用子类扩展的成员。向下转型具有潜在的危险,即父类指针实际上没有指向程序员要把它转换成的那种子类的对象。

43、使用虚函数的目的是什么?

虚函数目的:期望父类指针(或引用),不管指向父类还是子类,在调用override函数时,可以反应对象真是情况。

44、如何使用指向子类对象的父类指针或引用调用子类版本的函数?

-向下转型

-虚函数

45、继承时为什么父类的析构函数必须为虚析构

如果父类的析构不是虚析构则当(用delete)删除一个指向子类对象的父类指针时,则将调用父类版本的析构函数,子类只释放了来自于父类的那部分成员变量,而没有释放子类扩展的成员变量,造成内存泄漏。

46、什么时动态绑定,有什么好处?

虚函数被调用的时候到底调用那个版本,在变异的时候无法确定,只有在执行时才能确定称为动态绑定。动态绑定使得程序可以照顾到未来增加的代码,比如创建一个新的子类,在子类中覆盖了父类的虚函数。用之前的父类指针,依然可以正确的调用到新子类里的函数,而无需对旧代码进行更改。

47、什么是多态?

多态:用父类指针or引用,统一操作各种子类对象。父类指针或引用有多重表现形态。

48、简述虚函数调用的过程?

在每个虚函数的对象里,添加一个虚指针成员变量,虚指针指向虚函数表,首先通过虚函数指针找到虚函数表,虚函数表中存放的是虚函数的指针(地址),然后再通过虚函数指针找到虚函数。

49、什么是纯虚函数,什么是抽象类、什么是虚函数

纯虚函数:虚函数只有声明没有实现

抽象类:有纯虚函数的类较抽象类

虚函数:virtual关键字。

50、为什么要引入抽象基类和纯虚函数?

抽象类提供了不同种类对象的一个通用接口。父类声明子类实现

51、子类是否必须实现抽象基类中的所有的纯虚函数,为什么?

子类必须实现抽象基类中的所有纯虚函数。否则,子类依然是抽象类。

52、多重继承时会产生什么问题?

同名函数或变量,菱形继承时候有两份祖先类的成员。

53、菱形继承如何消除向上继承产生的二义性问题

-虚继承,1:直接继承祖先的额两个类,在继承时加virtual;

2:通过多重继承而来的那个子类(孙子辈),在构造是,要调用祖先的构造函数。

孙子类的派生类,直接继承祖先类的成员,在继承两个父类各自拓展的成员。

54、什么是名字空间,有什么作用?

-名字空间定义了全局标识符的作用域。

-名字空间作用:避免同一个程序中,不同文件里的全局标识符的冲突。

55、什么是函数模版,函数模版有什么好处?有很多函数仅仅是参数类型不同,但是实现过程很相似。在C++里,我们可以写一个通用函数,使用非实例化的参数类型,该函数被调用时进行实例化。这种函数称为函数模版。

56、简述静态强制转换和动态强制转换的区别static__cast:静态转型。不管父类指针是否真的指向子类对象,一律把指针转型后返回。转型不保证安全。

dynamic_cast:动态类型转换。把父类指针转型成子类指针,如果转型成功(即父类指针的确指向子类对象),返回子类对象地址;如果转型失败,返回null。即转型是安全的。

57、声明一个string类的对象string s(“Helloworld”);其中s[20]和s.at(20)的区别?

s.at(20)会自动抛出异常。

58、STL中有哪几大类容器,有什么区别?

-顺序容器&关联容器

1.元素存储的顺序不同

顺序容器:按照插入位置存储

关联容器:按键本身的值的大小来排列(和插入顺序无关)。

2.存取元素的方式不同

顺序容器:通过元素在容器里的位置(如:下标)存取;

关联容器:通过键(key)存取元素(不关心位置)。