43、面向对象的三个特征
多态、封装、继承
44、C++语言的优缺点
优点:
c++是面向对象的程序设计,在高级语言中,处理运行速度最快,而且还兼容了c语言
C++语言十分灵活,功能十分强大,它的优点在于性能和类层次结构设计
C++十分严谨、精确和数理化,标志定义很细致
C++语法思路层次分明、相呼应,语法结构是显示的,明确的
缺点:
语言过度复杂和标准库的过度苍白
45、同样是面向对象的语言,c++和jAVA相比有什么区别
1、JAVA的运行速度比C的执行速度慢上约20倍
2、JAVA所有的东西都必须置入一个类
3、JAVA中没有作用域范围运算符
4、JAVA没有预处理功能的详细介绍
5、JAVA里没有c++那样的指针,只有引用,JAVA中所有的对象都是分配在堆上,
6、JAVA采用了一种单根式的分级结构,所有对象都是从根类Object统一继承的,而c++可用来实现多重继承和多重继承
7、JAVA有垃圾回收机制,有了垃圾回收,就不会产生内存泄露,而c++需要用析构函数,delete来回收内存
46、C++和C语言有什么区别(具体可参考c到c++的升级)
1、C语言是面向结构的,c++是面向对象的
2、在C++中局部变量可以在一个程序块内在任何地方声明,在c中,局部变量必须在程序块的开始部分,即所有操作之前
3、C语言中是通过函数名来查找函数的,在c++里对函数有重载作用,根据各种函数的声明来查找
4、在c中,可以调用main函数,但是在c++中不能调用main函数
5、Register关键词在c语言中不能用取地址符来获取寄存器的地址,在C++中可以用取地址符,使用了取地址符就默认了取消了register的类型
6、在c++中可以用const修饰成员和成员方法,修饰成员的时候要进行初始化,修饰成员方法的时候只能使用不能修改,const调用const,不能调用非const,而在c中const一般用来修饰函数的形参
7、内存的分配和释放:在c语言中用malloc和free来分配和释放内存,在c++中使用的是new和delete来分配和释放内存和初始化
8、在c++中引入了“引用”这个概念,给变量起别名,还引用了命名空间,限定变量的作用域,使变量名不冲突,而在c里则没有这些概念。
9、在c++中可以对函数进行重载,而在c中无法对函数进行重
47、引用是什么?使用引用的时候有什么注意点吗
引用就是给变量起个名字,对应用的操作与变量直接操作效果完全相同。
注意点:
1、申明一个引用的时候,一定要对引用初始化,实际上是把值赋给了引用所绑定的对象
2、引用声明完成后,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表明该引用名是目标变量名的一个别名
3、引用本身不是一种数据类型,因此引用本身不占存储单元,系统也不会给引用分配存储单元。不能建立数组的引用。
4、引用可以用作函数的返回值,可以将函数放在赋值运算左边,但是不能返回局部变量的引用
48、将引用作为函数参数有哪些特点
(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象的操作。
(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作:而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本:如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间好。
(3)使用指针作为函数的参数虽然能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用“*指针变量名”的形式进行运算,这很容易发生错误且程序的阅读性差:另一方面,在主函数的调用点处,必须用变量的地址作为形参。而引用更容易使用,更清晰。
49、指针和引用的区别
1、引用是直接访问,而指针是间接访问
2、引用是对象的别名,不分配内存空间,而指针会分配内存空间
3、引用定义时一定要初始化,而指针不一定需要初始化
4、引用不是对象,不能定义指向引用的指针,指针是对象,可以定义指向指针的引用
5、引用一经初始化就不能引用其他变量,而指针可以。
尽可能使用引用,不得已使用指针
50、什么时候需要用引用
使用引用,不会调用对象的拷贝构造函数
在实际应用中,引用一般用作函数形参或函数的返回值
51、什么是内联函数?他的主要作用是什么?如何声明内联函数
编译器将代码量小,但使用频繁的函数做inline函数,内联函数是指用inline关键字修饰的函数。在类内声明部分定义的函数被默认成内联函数。
作用:内联函数在编译的时候将不进行函数的调用,提高了效率
内联函数只能是代码很少很简单的函数,因为如果一个很大很复杂的函数即使设为内联,编译器也将自动设置该函数为非内联。
52、内联函数和宏函数的区别
内联函数是用空间换时间,省去了函数调用的时间,宏函数是用时间换空间,对宏函数进行简单的替换
内联函数在调用的时候,要求实参和形参一致,内联函数会先对实参表达式进行求值,然后传递给形参,而宏函数的实参只是简单的替换成形参
内联函数是在编译的时候,在调用的地方将代码展开的,而宏函数是在预处理的时候进行替换的
在c++中建议使用内联函数取代带参数的宏函数
53、函数重载的条件
函数重载:相同的作用域,函数名相同,但是函数的参数不同,称为函数的重载
条件:
函数的参数个数不同,参数的类型不同,参数的顺序不同都可以用来做函数的重载,但是函数的返回值不可以用来做重载的条件
C++为了支持重载,用extern c来辨别是按c还是c++的编译方法进行编译
54、重载和重写(override)的区别
重载:函数名相同,函数的参数不同,不能只有返回值不同,可以有不同的访问修饰符;可以抛出不同的异常;存在于父类和子类和同类之间
重写:参数列表和返回类型必须与重写的函数相同
访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。
存在于父类和子类之间
55、命名空间的作用
限定变量的作用域,使变量名不冲突
56、四种类型转换运算符的区别
1、static_cast<>() 是用于基本数据类型之间的转换、有继承关系的类对象之间和类指针之间的转换,没有运行时类型检查来保证转换的安全性。
2、Const_cast<>() 是除去const属性
3、Reinterpret_cast<>() 是把一个指针转换为整数或将整数转换为指针
4、Dynamic_cast<>() 主要是将基类对象指针或引用转换成继承类指针,实现了类层次间的上行转换和下行转换,还可以用于类之间的交叉转换,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的; 在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
57、类和struct的区别
类声明的时候默认为私有类,结构体默认为公有的结构体
类继承的时候,默认的是私有继承,结构体继承的时候默认的是公有继承
58、什么是this指针,this指针的作用
1、this指针只能在一个类的成员函数中调用,它表示的是当前对象的地址。
全局函数,静态函数,友元函数都不能使用this