1)函数print_elephants和free_list的参数为什么一定要写成const Elephant* ptr而不能只写Elephant* ptr呢?
答:保证传入内容不被修改。
(2)比如free_list的函数体中,temp_ptr和ptr的类型都是const Elephant* ptr,可是却有这样的语句temp_ptr=ptr->next,难道说const类型的变量可以随便赋值么
答:定义的是常量指针,不是常量值,常量指针指向的内容是不可以被修改的。
不知还有什么疑问~~~
就这么回事。
#include
using namespace std;
int main()
{
const int *p;
int *q;
int a,b;
scanf("%d %d", &a,&b);
p = &a;
q = &b;
*q = 3;
*p = 2;
printf("a = %d,b = %d \n",a,b);
return 0;
}
*p 修改不了a的值就是因为p是常指针。
不是的,在对象生存期内是不可以改变的,过了生存期就是普通变量了。
在C++中,const成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。
const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类的声明中初始化const数据成员,因为类的对象没被创建时,编译器不知道const数据成员的值是什么。
const数据成员的初始化只能在类的构造函数的初始化列表中进行。要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现,或者static cosnt。
class Test
{
public:
Test():a(0){}
enum {size1=100,size2=200};
private:
const int a;//只能在构造函数初始化列表中初始化
static int b;//在类的实现文件中定义并初始化
const static int c;//与 static const int c;相同。
};
int Test::b=0;//static成员变量不能在构造函数初始化列表中初始化,因为它不属于某个对象。
cosnt int Test::c=0;//注意:给静态成员变量赋值时,不需要加static修饰符。但要加cosnt
const Elephant* ptr
这样是为了防止修改ptr指针指向的地址保存的值,如果你可以确保在这个函数中没有出现意外的修改ptr指向的内容,那么也可以不加const
而且这里的const不是对ptr而言的,而是对ptr指向的内容而言的,所以ptr还可以指向其它地址,如果是以下形式,那么ptr就不能指向其它地址了:
Elephant * const ptr
这种形式的定义说明,ptr是一个只读指针,它的指向不能更改,但是指向的内容可以更改,如果指向的地址和指向的地址保存的值都不想更改,就用以下形式:
const Elephant * const ptr
(1) 这两个函数用 const Elephant* ptr 做参数一是让读者明白这两个函数不会改变指针所指向的内容;二是防止编程的误操作修改ptr指针指向的内容。
(2) const Elephant* temp_ptr 表示temp_ptr 指向的内容是常量不可改变,但是temp_ptr 本身可变,也就是可以temp_ptr = ptr->next 是正确的,但是*temp_ptr = 15 这样的赋值操作就是错误的。
PS:
Elephant * const temp_ptr 这样的定义是指针不可变,自始至终只能指向一块内存空间
const Elephant * const temp_ptr 这样定义是指针和指针指向的内容都不能改变。
这么长的程序,你有疑问在哪一行代码也不指出,真想让人从头到尾的看你的程序啊???