您的位置:首页 > 编程语言 > C语言/C++

C++ 面试复习

2013-09-07 21:57 309 查看
1.类只在代码中出现,不会在运行的程序中出现,即编译时出现;对象在运行的程序中出现,并占用内存,是运行的实体;

2.消息传递的实质是方法的调用;

3.面向对象最突出的特征是:封装性、继承性、多态性

封装:将数据结构和作用在数据结构上的操作组成一个实体,单位是对象,提供动态代码共享;

继承性:提供静态的代码共享;

多态性:不同的对象收到相同的消息产生多种不同的行为方式

编译时的多态性:通过重载实现

运行时的多态性:通过虚函数实现。

4.const修饰符

1).常量是类型化的,它有地址,可以用指针指向这个值,但是不能修改该值,如const int a = 100;

2).指向常量的指针:一个指向常量的指针变量如const char * Name = "chen";因为所指为常量,因此不允许修改如Name[3]='a';错误,但是指针为普通指针,可以改变所指,如 Name="Zhang";

3).常指针:该指针本身是一个常量 如 char * const Name = "chen"; 指针为常量意味着不能改变所指,但其指向的数据本身可以改变即: Name = "zhang" 错误但是 Name[3] = 'a' 合法;

4).指向常量的常指针:const char * const Name = "chen";

5.内联函数不能有循环语句和开关语句,在类定义里定义的函数皆为内联函数。

6.带默认参数的函数

a.取默认值的参数必须出现在不去默认值的右边,即:一旦开始定义默认值不允许再出现非默认值的参数;

b.在函数调用时,若某个参数省略,则其后面的参数皆应省略(使用默认值);

c.实参与形参匹配顺序为:左到右

7.C++ 中的强制类型转换:int i= 10;float x = float(i)(C 风格)→float x= float(i)(C++ 风格);

8.new运算符从称为堆的一块自由存储区中为程序分配一块所需大小的内存,假如new分配失败将返回NULL;

9.引用:不单独占用内存,与被引用对象占用同一块内存空间,在声明时进行初始化,引用不可重复赋值;

a.不允许对void进行引用;

b.不能建立引用数组;

c.不能建立引用的引用及指向引用的指针,即:int &&i = L;int &* p = n;

10.void 型指针进行在处理时须进行显示转换,且void指针不能进行++、--操作;

11. 定义对象时编译器自动调用构造函数,如果需要将数据成员放在堆中或者栈中或者数组中,则应在构造函数中使用赋值语句而不是使用初始化表;

没有构造函数的类,其共有成员可采用初始化表进行初始化。

12.析构函数不能呗重载,而且无参数,自动被调用,析构函数被调用的场合:

1.显示撤销对象时;

2.一个对象定义在函数内,当该函数结束时;

3.使用deleted时候

13.拷贝构造函数:有一个参数,是同类对象的引用,每个类必有一个(没自定义的时候编译器默认生成一个)

形式: classname  (const classname &ob){ };

调用形式:若有A现在生成B则: classname B(A) 或 classname B = A;

作用:根据已存在对象建立一个新对象

注:当类中有指针类型成员时应自定义拷贝构造函数

14. 对象数组:考虑数组元素的初始化问题(略)

15.类对象占用内存的大小:有数据成员大小(注意内存对其)+虚表(假如有虚函数的话)+1(假如是空类的话,此时前面的全是0);注意类里面的静态成员占用的空间不会在计算类占用空间时被计算进去。

16.C++为成员函数提供了一个名为this的指针,每当创建一个对象时,this指针初始化为指向该对象,每当调用一个成员函数时,系统自动把this指针作为一个隐含的参数传递给该函数。

this是一个const指针,不能给他赋值

this作用于为函数内部(局部的)

17.静态数据成员 

  a.静态数据成员属于类,可使用“类名::静态成员名”的方式访问,也可使用对象访问;

b.不能在类中初始化,在类外--一般是main函数前、源文件中初始化;

c.在编程时创建比并初始化,它先于任何对象存在;

18. 静态成员函数

属于类,而不是对象

可通过“类名::静态成员函数名”的方式访问,也可使用对象访问;

主要用来访问全局变量或者同一个类的静态数据成员;

可在任意对象之前处理静态成员

无this指针,一般不妨问非静态数据成员

19.友元函数

可访问类的各个私有数据成员;

一般有一个所访问类的入口参数,通过该参数引用该类的成员

20.类对象作为其他类的成员构造函数初始化问题:

x::x(参数表0):对象名1(参数表1),......,对象名n(参数表n){ }

当执行构造函数时,先按对象成员在类中定义的顺序依次调用他们的构造函数,在执行X的函数体

21 常对象:const 类名 对象名(参数表)

C++不允许常对象调用普通的成员函数,只能调用它的常成员函数。

22.常成员函数

常成员函数以及常引用必须都用初始化表进行初始化;

形如: 类型 函数名(参数表) const;

1) 函数的实现部分也必须有const

2)区别:const 类型 函数名(参数表);表示函数返回const

3)一般对象可调用常函数和普通函数

23.基类的构造函数和析构函数不能被继承。当创建派生类对象时,首先执行基类的构造函数随后执行派生类的构造函数,析构顺序相反;

24.当基类的含有带参数的构造函数时,派生类必须定义构造函数,以实现将参数传递给基类构造函数的途径

派生类名(参数总表):基类名(参数表){ }

25.当派生类含对象成员时,其构造函数的形式如下

派生类名(参数总表):基类名(参数表),内嵌对象名(参数表){ }

执行顺序:基类构造函数→内嵌对象构造函数→派生类函数体

26.虚基类 :从基类派生出新类时,使用virtual说明的基类

class 派生类名:virtual 继承方式 基类名{......};

说明:虚基类类似静态成员以及全局变量

a.建立一个对象时,如果对象含有虚基类成员,则虚基类成员是从最远派生类初始化的;

b.若同一层次中同时包含虚基类和非虚基类,应先调用虚基类的构造函数,然后调用非虚基类的构造函数,最后调用派生类的构造函数;

27.赋值兼容规则:凡是用到基类的地方都可用子类替代;

可以用派生类对象给基类对象赋值;

可以用派生类对象来初始化基类的引用;

可以把派生类对象的地址赋值给指向基类的指针;

可以把指向派生类对象指针赋值给指向基类的指针;

28.运算符重载

1).写一个运算符函数,其名字为operator后接一个要重载的运算符: 类名 operator+(类名 obj1,类名obj2);

2).不能重载的运算符:. * :: , sizeof,?: 

3).友元运算符函数

声明: friend 返回类型 operatpor 运算符(形参表);

定义:返回类型 operator 运算符(形参表){ } ;

友元函数无this指针,使用友元函数重载单目运算符++、--时,应传引用;

(返回引用的函数调用可放在赋值表达式的左边,任何时候传递引用绝对错不了)

4).成员运算符函数

单目:参数表为空

双目:参数表只有一个参数——运算符的右操作对象(的引用)

5).++与--的重载

前缀:

成员重载:ob.operator++()

友元重载:ob.operator(x&ob)

后缀:

成员重载:ob.operator++(int)

友元重载:ob.operator(x&ob,int)

(int 一般取0)

29.重载赋值运算符解决指针悬垂问题

30.虚函数:

定义方式:在基类的成员函数前添加virtual,在派生类中重载(函数名、返回类型、参数类型、个数、顺序完全相同)

使用方法:通过将派生类对象地址赋值给基类指针,从而在程序运行中获得动态联编

注意事项:

a.构造函数、友元函数不能成为虚函数

b.某函数一旦被声明为虚函数,在派生类中将自动继承;

c.虚函数可在另外一个类中被声明为友元函数;

31.纯虚函数与抽象类

1).纯虚函数有声明无定义

2).含有纯虚函数的类为抽象类,只能做为基类;

3).纯虚函数定义:virtual 函数返回类型 函数名(参数表) = 0;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试 c++