1.运算符的本质是什么?
把运算符看作函数名,通过函数重载的方式为同一个运算符实现不同规则的运算,故运算符重载的本质就是函数重载。
2. 怎样进行运算符重载?
运算符重载的函数名是由关键字operate和其后重要的运算符符号构成。运算符函数定义的一般格式如下:
数据类型 operate <运算符符号>(<参数列表>)
{
<函数体>
}
3、哪些运算符可以重载?
“+”,“-”,“*”,“/”,“%”等除了“.”“.*”“::”sizeof和三目运算符以外C++中所有自带的运算符都可以重载。
4、合法的运算符重载有哪些限制?
(1) 重载之后的运算符不能改变运算符的优先级和结合性;
(2) 重载之后的运算符不能改变运算符操作数的个数及语法结构;
(3) 重载的运算符操作数至少有一个是自定义类型的;
(4) 重载运算符函数通常不能有默认的参数。
5、当运算符重载为类的成员函数时,应注意什么?
(1)函数的参数个数要比原来的操作数少一个左操作数(成员函数用this指针隐式地访问了一个对象,后置单目运算符不需要显式说明参数)。
(2)调用成员函数运算符的标准格式:
<对象名>.operator<运算符>(<参数>) <=> <对象名><运算符><参数>
如: m.operator+n <=> m+n
(3)除 =、()、[ ]、->不能重载为类的友员函数外其他运算符都可以重载为类的成员或友员函数。
6、虚继承的作用?
多重继承时,如:D继承自类B和类C,而类B、C继承自类A,当把类B和C定义为对A的虚继承时,类A、B、C、D共享同一份变量或函数。如:
d.D::a;可以用以下表示:
d.A::a;
d.B::a;
d.C::a;
7、父类和子类对象之间的赋值有什么限制?
·有公有继承关系的对象间才可以赋值
·子类对象可以给父类对象赋值
·父类对象不可以给子类对象赋值
·若想父类对象给子类对象赋值,可以强制类型转换(很危险)
8、重载、覆盖以及隐藏有什么区别?
重载通常指函数重载,表示在一个类中,函数名相同而参数不同,称为函数重载;
覆盖是指子类覆盖父类的函数,覆盖的要求是函数名相同,参数相同,并且父类函数必须有virtual关键字,如果没有就构不成覆盖;
隐藏是指子类函数屏蔽了其同名的父类函数或变量,子类的函数或变量可以通过子类对象直接访问,父类的公有函数或变量通过如下形式访问:
子类对象.父类::父类公有函数或变量
9、虚函数有什么特点?
·使用虚函数时,存在子类公有继承自父类才有意义
·如果在父类中显式声明函数为虚函数,在子类中同名同参的函数即使没有显式声明为虚函数,它也是虚函数
·虚函数必须是所在类的,不能是友员函数和静态成员函数
·构造函数不能是虚函数,但析构函数可以是虚函数
10、类在内存中怎么存储?
用sizeof统计得到的内存是成员变量所占内存,静态成员并不算在内,而成员函数存储在代码段,也不算在内。