C++11标准提供了说明符final。需要注意的是,C++11中的final不是关键字,而是说明符,这意味着您可以将它(在不引起混淆的情况下)将它作为标识符使用(为了兼容以前的代码)。关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。

C++11标准提供了说明符final,用于阻止派生类覆盖特定的虚方法。或是阻止一个类成为基类。

语法1:class Someclass final {...};

语法2:class Someclass {...type somefun(arg-list) final;...};

class A
{
private:
public:
virtual void Test()const final
{std::cout<<c<<std::endl;}
//final修饰了put()函数,使其不能被覆盖

};
 
classB:publicA
{
private:
public:
//这里不能有void  Test();了,因为有了final说明符

};
 

class A  final//final修饰Z类,您不能从Z类派生出一个类,而只能用于创建对象
{
private:

public:
void Test()const{std::cout<<d<<std::endl;}
};
 
int  main()  //修饰变量,变量不可变
{

char final ='X';//可以这么做
Xx(final);
x.put();//输出X
Yy;
y.put();//输出B
Zz(3.14159);
z.put();//输出3.14159
return0;
}


finalize-方法名。Java技术允许使用finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。

这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize()方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前被自动调用的。

垃圾收集器只知道释放那些由new分配的内存,所以不知道如何释放对象的“特殊”内存。为解决这个问题,Java提供了一个名为finalize()的方法,它的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存。所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作(如关闭流等操作)。但JVM(Java虚拟机)不保证此方法总被调用。

Finalize 操作具有下列限制:

垃圾回收过程中执行终结器的准确时间是不确定的。不保证资源在任何特定的时间都能释放,除非调用 Close 方法或 Dispose 方法。

即使一个对象引用另一个对象,也不能保证两个对象的终结器以任何特定的顺序运行。即,如果对象 A 具有对对象 B 的引用,并且两者都有终结器,则当对象 A 的终结器启动时,对象 B 可能已经终结了。

运行终结器的线程是未指定的。

在下面的异常情况下,Finalize 方法可能不会运行完成或可能根本不运行:

另一个终结器无限期地阻止(进入无限循环,试图获取永远无法获取的锁,诸如此类)。由于运行时试图运行终结器来完成,所以如果一个终结器无限期地阻止,则可能不会调用其他终结器。

进程终止,但不给运行时提供清理的机会。在这种情况下,运行时的第一个进程终止通知是 DLL_PROCESS_DETACH 通知。

在关闭过程中,只有当可终结对象的数目继续减少时,运行时才继续 Finalize 对象。


finally在异常处理时提供finally块来执行所有清除操作。主要与try-catch-finally配合使用。

finally语句块的作用是无论出现什么情况,finally块中的语句一定会被执行,并且是在return之前执行。根据JAVA规范,如果try-finally或者catch-finally中都有return,则2个return都执行并最终返回调用者那里的是finally中的return,如果finally中没有return则返回的是catch中的return,但是finally中的代码也是要执行的。


finally,finalize,都是JAVA中才有的,本人对JAVA不是很知道,只能浅析,若读者想深一步了解,可以http://www.ibm.com/developerworks/cn/java/j-lo-finally/到这里看看。