符号常量
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}