工作中的C++:基本原理,重点推荐和结束语
2010-10-15 09:07:33 来源:Web开发网目录
基本原理
抛弃托管扩展
未来的乐趣
编程的演变
终极目标
结束语,尽管不是再见
这个月,我要改变常规的问答形式来告诉您关于我在网上发现的一个非常不错的文档。几个星期前,有人写信询问我,为什么他不能在 C++/CLI 中声明 const 函数:
// 引用类
ref class A {
void f() const; // 不!
};
对此,我回复道:您就是不能,这是规则。公共语言基础结构 (CLI) 是为支持诸如 Visual Basic®、Java 甚至是 COBOL 语言而设计的 - 这些语言甚至不知道 const 的含义。因为 CLI 不知道 const 成员函数为何物,所以您不能使用。
我打完回复后,模糊地记起了一些埋藏在记忆深处的一些东西,关于 const,关于如何处理编译器提示以使其他语言可以忽略这些提示。我查找了以前的专栏,发现曾在 2004 年 7 月回答过一个关于 const 的问题。实际上,C++/CLI 的确允许声明 const 数据成员和参数 - 但不是 const 成员函数。图 1 显示了一个小程序,其具有 const 静态数据成员的引用类。如果编译此程序,然后使用 ILDASM 来反汇编,您将看到类似于下面的信息:
field public static int32
modopt([mscorlib]System.Runtime.CompilerServices.IsConst)
g_private = int32(0x00000001)
Figure1const.cpp
////////////////////////////////////////////////////////////////
// 要编译类型:
// cl /clr const.cpp
//
#include <stdio.h>
ref class A {
int m_val;
// 允许使用常量数据成员,将生成 modopt
static const int g_private = 1;
public:
// 公共常量成员可由 Visual Basic 或其他不能识别常量的程序
// 来修改(因而改用字面量)。
literal int g_public = 1;
A(int i) { m_val = i; }
void print(); // const; // 不!不允许使用常量 fn
};
void A::print()
{
printf("Val is %dn",m_val);
}
int main()
{
A a(17);
a.print();
}
Modopt(可选的修饰符)是一种对 CLI 使用者宣告的 MSIL 声明符:如果您了解它,很好;如果不了解,可以完全忽略它。相反,modreq(所需的修饰符)表示:如果您不了解它,就不能使用此函数。Volatile 便是 modreq 的一个示例。因为一个 volatile 引用随时都可以被操作系统/硬件(甚至是另一个线程)更改,所以 CLI 使用者最好知道 volatile 的含义,如果想要使用 volatile 对象的话。但 const 是可选的。请注意,尽管托管扩展会将 C++ const 对象转化成 CLI 文字量,C++/CLI 不再这么做了。因此要小心 - 如果声明一个公共 const 数据成员,用像 Visual Basic 这样的语言编写的客户端能够改变它的值。如果您希望 CLI 客户端不能改变该值,就应该声明对象字面量,如在图 1 中所示。但是,成员函数呢 - 为什么 const 成员函数是不允许的?
赞助商链接