当前位置: 移动技术网 > IT编程>开发语言>C/C++ > 程序开发之C++语言基础

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

2018年03月11日  | 移动技术网IT编程  | 我要评论

姚明十佳球,在线简繁,101号宠物恋人3

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)存取元素(不关心位置)。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网