Const在面向对象中的整合
在之前就整理了关于const在C++中的面向过程的一些内容,那么现在接触到了面向对象,决定再对它进行一次整合。
const是一个C++的关键字,具有着举足轻重的地位。它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一定帮助。另外CONST在其它编程语言中也有出现,例如Pascal、PHP5、B#.net、HC08 C、C#等。
① 指向常对象的指针变量
和之前的那篇博客的不同之处在于这里是指向常对象,之前是常变量。不过换汤不换药,既然是面向对象,那么肯定是指向常对象 (~ ̄▽ ̄)~
举个例子,如:
class Student
{
public:
int num;
char name[20];
Student(int a, char b[]) :num(a) { strcpy(name, b); }; //初始化表
void show(void)
{
cout << "学生信息如下:" << endl;
cout << "学号:" << endl;
cout << "姓名:" << endl;
}
};
int main(void)
{
Student s1(1003, "张三"), s2(1004, "李四"), s3(1006, "老六");
const int* p1 = &s1.num;
Student* const p2 = &s2;
const Student*p3=&s3;
return 0;
}
如上所示,这是一个含有类的面向过程的一个程序。
由于在这里要对数据成员进行指向,所以我把所有的数据成员包括成员函数全部设置成了公开。
那么对于指针变量p1:
*p1=1000; 不合法,p1指向的是常量,内容不可变,编译器会报错
p1=&s2.num; 合法,p1可以指向另一个变量,程序正常运行
另外在这里说一下:
s1.num=1000; 合法的,可以通过直接访问的方式对数据成员进行内容改变
只是说通过间接访问的方式(也就是指针)无法对数据成员进行内容改变
等等,这他妈不是指向常量的指针变量吗,怎么是指向常对象的指针变量…(* ̄(エ) ̄)
(还有常变量,即const int a = 2这样的,a就是一个常变量,a既不是常量也不是常对象,注意,这三个有点绕)
确实,p1是指向常量的指针变量,p3才是指向常对象的指针变量,不过这两者原理一样。
(*p3).num=800; 不合法,不能通过指针变量来改变学号
strcpy((*p3).name,"老大"); 同样不合法,不能通过指针变量来修改姓名
p3=&s1; 合法,可以指向另一个对象,程序正常运行
同样的,与指向常量的指针变量一样,可以直接修改数据成员的值但是不能通过指针变量来修改,如果想要数据成员无法被改变则应改成:const Student s3
在指向另一个对象之后,*p3也会发生改变。
② 指向对象的常指针
如上所示,p2就是一个指向对象的常指针。
(*p2).num=999; 合法,可以通过指针变量的方式修改学号
strcpy((*p2).name,"李哥"); 合法,也可以修改姓名
p2=&s1; 不合法,不能改变指针变量的值,也就是p2的指向不可改变
③指向常对象的常指针
const Student*const p;
综合以上两者,指向常对象的常指针既不能更改指针的指向,也不能修改对象的内容。