符号常量

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

符号常量

●使用修饰符const

●使用enum关键词定义一组整数常量

如果只使用const修饰符,变量将自动转为int整型。比如:

const size = 10;

意为

const int size = 10;

除了不可改变值外,命名后的常量和变量一样。

C++中,变量必须初始化。而在标准C中,常量不必初始化,如没有初始化,常量默认为0;

C和C++中,const变量的作用域也不同。C++中,常量默认为内部链接,所以在其声明的文件内可见。在标准C中,常量就是全局变量。它们在声明文件之外都可见。不过,加上static声明后,标准C中的常量也可变成局部可见。而在C++中,为了使某个常量链接到外部,以便能被另外的文件访问,我们需要显示地在常量定义前面加extern关键词。如下:extern const total = 100;

另一个命名整数常量的方法是使用枚举类型,如下所示:

enum {X, Y, Z};

此句定义了X、Y和Z三个整型变量,值分别为0,1,2。该语句等价于下列语句:

const X = 0;

const Y = 0;

const Z = 0;

我们也可显式地赋值X,Y,Z,如下:

enum {X = 100, Y = 50, Z = 200};

可赋予任何整数值。

常量指针与指针常量

C++中添加了指针常量和常量指针。

char* const ptr1 = “GooD”; //指针常量

我们不能修改ptr1指向的地址。

int const * ptr2 = &m; //常量指针

ptr2声明为常量指针,它可以指向任何正确类型的变量,但指向的值不可改变。

我们也可以同时将指针和变量声明为常量,如下所示:

const char * const cp = “xyz”;

该语句声明cp为指针常量,并指向一个声明为常量的字符串。这种情况下,赋予指针cp的地址和指针指向的值都不能更改。

成员指针

我们可以取类成员的地址,并将其赋值给同一个指针。对于一个完全修饰的类成员名,我们可对其应用操作符&,来获得成员的地址。声明一个类成员指针时,可使用类名和操作符::*。比如,给定下列类

class A

{

private:

int m;

public:

void show();

};

我们可以如下定义成员m的指针:

int A::* ip = &A::m;

指针ip被创建后,就如同类的成员一样,必须使用类对象才能调用。在上述语句中,A::*意为“指向类A的成员的指针”,而&A::m意为“类A的成员的地址”。

记住,下列的用法是不合法的。

int* ip = &m; //不合法

这是因为m不是一个简单的整型数。只有和属于的类相关时,它才有意义。所以对于这种指针和和成员,必须使用作用域操作符。

在成员函数内(或者友元函数内),指针ip可用于访问成员m。假定a是在成员函数内声明的A类对象,我们可按如下方法,用指针ip访问m。

cout << a.*ip; //显示

cout << a.m; //和上行一样

现在,看一下下面的代码

ap = &a; //ap是对象a的指针

cout << ap->*ip; //显示m

cout << ap->m; //和上行一样

当使用对象和成员的指针时,我们用取值符->*来访问成员。当在对象中使用了成员指针时,则用取值符.*。注意到*ip的用法形同成员名。

我们也可以设计成员函数的指针,在main()函数中,可用取值符调用指针指向的函数,如下所以:

(object - name.*pointer - to - member function)(10); (pointer - to - object->*pointer - to - member function)(10);

()的优先级要高于.*和->*,所以括号是必要的。

程序案例:

#include

using namespace std;

class M

{

private:

int x;

int y;

public:

void setValue(int a, int b)

{

x = a;

y = b;

}

friend int sum(M m);

};

int sum(M m)

{

int M::* px = &M::x; //格式1

int M::* py = &M::y;

M* pm = &m;

int S = m.*px + pm->*py; //格式2

return S;

}

int main(int argc, char* argv[])

{

M n;

void(M::*pf)(int, int) = &M::setValue; //格式3 (n.*pf)(10, 20);

cout << "sum = " << sum(n) << endl;

M* op = &n;

(op->*pf)(30, 40);

cout << "sum = " << sum(n) << endl;

system("pause");

return 0;

}

相关文档
最新文档