设为首页 加入收藏

TOP

【C++研发面试笔记】1. C++常见关键字含义(二)
2016-10-08 11:31:16 】 浏览:721
Tags:研发 面试 笔记 常见 关键字 含义
用其余的静态成员函数。下面举个静态成员函数的例子。
关于静态成员函数,可以总结为以下几点:

1、出现在类体外的函数定义不能指定关键字static; 2、静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数; 3、非静态成员函数可以任意地访问静态成员函数和静态数据成员; 4、静态成员函数不能访问非静态成员函数和非静态数据成员; 5、由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长; 6、调用静态成员函数,可以用成员访问操作符来调用静态成员函数,也可以直接使用如下格式: <类名>::<静态成员函数名>(<参数表>)

1.5 virtual

声明虚函数,用于实现多态,该关键字是基于声明的。
所谓虚函数,虚就虚在“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。
由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被称为“虚”函数。只要在基类中已声明为virtual,这里即使不使用virtual关键字,默认也是虚函数。同样,如果还有从子类派生的子类,对应的成员函数也是虚函数。

1. 虚函数
虚函数只能借助于指针或者引用来达到多态的效果
通过这些手段,编译器在看到一个虚函数调用的时候,就将会在运行时刻决定调用哪个函数。虚函数必须要被定义。

2. 虚析构函数
析构函数也可以是虚的,甚至是纯虚的。当一个类打算被用作其它类的基类时,它的析构函数必须是虚的。在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。而直接用继承类的指针去操作继承类的成员,却不会出现这种情况。

3. 纯虚函数
如下声明表示一个函数为纯虚函数(纯虚函数也可以有定义)(如果一个类里面有一个或多个纯虚函数,这个类就是抽象类)。纯虚函数用来规范派生类的行为,实际上就是所谓的“接口”。它告诉使用者,我的派生类都会有这个函数。而试图创建一个抽象基类的独立类对象会导致编译时刻错误。
virtual void foo()=0; // =0标志一个虚函数为纯虚函数

4. 构造函数和析构函数中的虚函数调用
一个类的虚函数在它自己的构造函数和析构函数中被调用的时候,它们就变成普通函数了。也就是说不能在构造函数和析构函数中让自己“多态”。这是因为派生类对象中构造函数的调用顺序是,先调用基类的构造函数,然后是派生类的构造函数。在基类析构函数中也是如此。

5. 虚函数与纯虚函数的区别

虚函数和纯虚函数可以定义在同一个类中,含有纯虚函数的类被称为抽象类,而只含有虚函数的类不能被称为抽象类。 虚函数可以被直接使用(必须被定义),也可以被子类重载以后以多态的形式调用,而纯虚函数必须在子类中实现该函数才可以使用,因为纯虚函数在基类只有声明而没有定义。 虚函数和纯虚函数都可以在子类中被重载,以多态的形式被调用。 虚函数和纯虚函数通常存在于抽象基类之中,被继承的子类重载,目的是提供一个统一的接口。 定义了纯虚函数的类称为抽象类,抽象类不能被实例化。

1.6 friend

声明友元函数和友元类,该关键字也是基于声明的。
采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。

1. 友元函数
有时需要定义一些函数,这些函数不是类的一部分(注意友元函数不是类的一部分),但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该类的友元函数。
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:
friend 类型 函数名(形式参数);

友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。 一个函数可以是多个类的友元函数,只需要在各个类中分别声明。友元函数的调用与一般函数的调用方式和原理一致。 友元函数并不是类的成员函数,因此在类外定义的时候不能加上class::function name

2.友元类
除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。同友元函数一样,其也需要在类中加上关键字friend声明。
友元类的所有成员函数都是类的友元函数,能存取类的私有成员和保护成员。

友元关系不能被继承。 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。

1.7 volatile

volatile的本意是“易变的”,volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。可以与const同时修饰一个变量。

当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被寄存。volatile可以保证对特殊地址的稳定访问。

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

一个参数既可以是const还可以是volatile,一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。


1.8 struct, class, union

class是一般的类类型。struct在C++中是特殊的类类型,声明中仅默认隐式的成员和基类访问限定与class不同(struct是public,class是private)。union是联合体类型。class还有个用途是在模版类型声明中作为表示模版类型参数或模版模版参数的语法的必要组成部分,等同于typename。

至于union在很多地方跟struct类似,但有一些特别的地方。

一个时点上只有一个成员可用,(换句话说,所有成员使用的是同一块内存,即所有成员公用的一个地址。)。 不能做基类,也就没有虚函数。 不能有静态和引用成员。 不能嵌套类(实际上是不能拥有具有构造函数、析构函数、赋值操作的成员,如果仅仅是数据封装还是可以的)。

1.9 extern

extern意为“外来的”,是存储类声明修饰符。其有两个作用:

当它与”C”一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的”脾气”了(不同的编译器采用的方法不一样),主要是因为C++支持函数
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【C++研发面试笔记】12. 基本数据.. 下一篇利用c++实现数值坐标刻度生成,并..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目