1.C语言与c++的区别?
C语言是面向过程的语言,C++是面向对象的程序语言
2:类和对象的关系
类是对象的类型,对象是类的具体实例。如果学生就是一个类型,而学生张三就是一个具体的对象
3:一个类由几个部分组成?
成员变量和成员函数。
4:构造函数有什么用
构造对象时对对象的初始化
5:构造函数的特点
1,必须公有
2,构造函数和类名一致
3,无返回值;
4,构造函数可以接受参数用来初始化类的数据成员
6:什么是默认构造函数
默认构造函数分为两种:1:构造函数不带参数 2:构造函数带参数但参数有默认值
7:程序员在定义类时是否必须写一个构造函数,为什么
不必须,如果程序员一个构造函数都没写,编译器将提供一个空的默认构造函数,他不会对数据成员进行初始化。一旦程序员提供的构造函数,编译器将不提供默认构造函数。
8:什么是函数重载,并举例说明
1:参数列表不同(a,参数个数不同,b,参数类型不同)
2:仅仅返回值不同不能算函数重载
Thing();
Thing(int a);
Thing(int a,int b);
9:什么是初始化列表,有什么作用,什么情况下必须使用初始化列表?
在构造函数的函数头,对类的成员变量进行初始化。
初始化列表优势:
1:效率高
2:有一些类型的成员变量,只能用初始化列表的方式进行初始化
10:什么是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:赋值运算符重载的5步
1:避免自赋值,避免把一个对象赋值给它自己。
2:释放掉指针成员已经指向的内存,避免内存泄露
3:为指针成员开辟新内存空间
4:内容本身的copy
5:返回 *this
29:C++中什么时候回调用拷贝构造函数。
通过拷贝一个已有的对象,来创建一个新的对象。
1.classT object(anothier_object); 把已经存在的对象,作为新声明对象的构造函数的参数。
2.classT object = another_object; 声明一个对象,并用赋值表达式,用一个已有对象来初始化它。
3.用传值得方式,从函数返回一个对象,也将调用拷贝构造函数。
30:c++的空类,编译器会默认提供哪些成员函数
一个缺省的构造函数,一个拷贝构造函数,一个析构函数,一个赋值运算符
31:简述C++中的继承
子类继承父类所有的成员,但不包括构造函数,析构函数和赋值运算符重载,子类继承父类后子类的成员有两部分,一个继承父类的成员而是子类自己扩展的成员
32:子类继承父类后,子类的成员包括几部分?
子类继承父类后子类的成员有两部分,一是继承之父类的成员 二是子类自己扩展的成员。
33:什么是函数重写。
子类可以自己实现与父类成员函数原型相同(函数名,参数列表)的成员函数,称为重写
34:子类重写父类的函数后,能否用子类对象调用到被覆盖的父类版本的函数?
可以,在子类中调用被覆盖的父类版本的函数时,在函数名前加 父类类名::
35:子类能否直接访问父类的”私有”成员,有几种方式可以访问到该”私有”成员
1:通过继承之父类的公有成员函数来访问继承之父类的私有成员
2:将父类的私有成员改为protected成员
36:简述public.protected.private三中继承方式的区别
私有继承:子类中所有继承父类的成员
保护继承:继承自父类的public成员。变成子类的protected成员:而继承自父类的protected和private,访问权限保持不变
公有继承:所有继承自父类的成员,访问权限都保持不变。