1.【多态性】所谓多态性,就是由于继承而关联在一起的不同类的对象,对于相同的成员函数调用作出不同反应的一种能力。C++中的多态性分为两类:编译时的多态性和运行时的多态性。编译时的多态性是通过函数重载和模板体现的,其实现机制称为静态绑定;运行时的多态性是通过虚函数体现的,其实现机制称为动态绑定。
2.【动态绑定】通过对基类的引用或者指针调用虚函数时,发生动态绑定。换句话说,C++中的动态绑定是通过虚函数表实现的。这个虚函数表记录了虚函数的地址,能够解决继承和覆盖的问题,保证动态绑定时能够根据对象的实际类型调用正确的函数。
3.【类的成员访问】有如下类定义:
class Test
{
public:
Test( )
{
a=0;
c=0;
} //①
int f(int a) const
{
this->a=a;
} //②
void h(int b)
{
Test::b=b;
} //③
static int g( )
{
return a;
} //④
private:
int a;
static int b;
const int c;
};
int Test::b=0;
在标注号中,能被正确编译的是( ) A.① B.② C. ③ D.④
一个类的常数据成员的初始化只能在成员初始化列表中进行,所以选项A不正确。常成员函数不能更新对象的数据成员,所以选项B不正确。静态成员函数可以直接访问类中说明的静态成员,但不能直接访问类中说明的非静态成员,所以选项D也不正确。故应该选择C。
4.【运算符结合的优先级】
x=1,y=1,z=1, 执行表达式w=++x||++y&&++z 后,x、y、z 的值分别为?
首先是从左往右的。
w=++x||++y&&++z
第一步:
w= (++x) || (++y&&++z);
因为||这个符号的优先级最低,先考虑++。
第二步:
++x; 执行完之后x=2;
(对于||这个符号有个特点就是如果左边是非零,那么直接就返回值了,不用执行右边了。因为没有意义,1或0还是1.)
第三步:
||左边是非零,直接结束,w=1;
所以w=1,x=2,y和z仍为一。
5.【运算符重载】运算符重载操作(overload)不改变运算符的优先级,语法,结合性和操作个数。
6.【protect】在基类中声明为protected的成员可以被派生出的任何类的成员和友元访问,也可以在基类体内被基类的成员和友元访问,但在类外(比如主函数内)无法被访问。
7.【new】类型名 *指针名=new 类型名。这个过程中,new类型名告诉编译器,需要适合类型名这个类型的内存空间。new根据类型确定使用多少字节的内存,然后返回这个内存的地址。实质上,变量是在编译时分配有名称的内存,而指针可以直接访问运行阶段分配未命名的内存以及内存值,使用new方法更有效。
8.【无条件大括号】求这段代码的输出结果
#include<iostream>
using namespace std;
int i = 0; //全局i=0
int fun(int n)
{
static int a = 2;
a++;
return a+n;
}
void main()
{
int k = 5;
{
int i = 2; //此时i=2
k += fun(i);
}
k += fun(i); //此时i=0;
cout << k;
}
#include"iostream.h"
class A
{
private:
int x;
public:
A(int x);
};
A::A(int x)
{
this->x=x;//此处this->指明左边的x是对象的变量,右边的x是形参x,如果形参用y来代替,this->就可以不用写了
cout<<x;
}
void main()
{
A a(5);
}