C++中const变量难道能随便赋值吗?

2025-03-03 17:03:06
推荐回答(5个)
回答1:

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是常指针。

回答2:

不是的,在对象生存期内是不可以改变的,过了生存期就是普通变量了。
在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

回答3:

const Elephant* ptr

这样是为了防止修改ptr指针指向的地址保存的值,如果你可以确保在这个函数中没有出现意外的修改ptr指向的内容,那么也可以不加const

而且这里的const不是对ptr而言的,而是对ptr指向的内容而言的,所以ptr还可以指向其它地址,如果是以下形式,那么ptr就不能指向其它地址了:

Elephant * const ptr

这种形式的定义说明,ptr是一个只读指针,它的指向不能更改,但是指向的内容可以更改,如果指向的地址和指向的地址保存的值都不想更改,就用以下形式:

const Elephant * const ptr

回答4:

(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 这样定义是指针和指针指向的内容都不能改变。

回答5:

这么长的程序,你有疑问在哪一行代码也不指出,真想让人从头到尾的看你的程序啊???