请教一个常量和变量的问题!

ggzzkk 2001-06-14 10:50:00
原来还没有接触const的时候,变量很容易理解像int a=123;a就是一个变量,并初始化,不过写成const int a=123;a就变成了一个常量了,那么a的值永远就是不变的,都是等于123。请问常量和变量的关系就是这样理解吗?还是有更深的含义?请朋友们指教,谢谢!
...全文
133 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
孩皮妞野 2001-06-15
  • 打赏
  • 举报
回复
Don't do it if the member is a pointer to a dynamically allocated block, eg:

class C3{
char * Msg;
public:
C3(const char * aMsg){Msg = strdup(aMsg);} //strdup makes a copy of aMsg in the heap.
/* Don't do it this way
* C3(const char * aMsg) : Msg(aMsg){}
* It's problematic because Msg becomes dependant on aMsg, if aMsg is deleted
* Msg will point to a invalid block, access of it result in AV
**************************************************************************/
};


孩皮妞野 2001-06-15
  • 打赏
  • 举报
回复
是的, 对一些定义了COPY constructor(拷贝构造函数)的类和基本类型(int, char, float,etc) 得类成员, 可以用这种方式初始化,

比如,

class C1{
int x, y;
public:
C1(int x, int y) : x(x), y(y){}
/* here x, y are basic data type(int), you would otherwise rewrite it as:
* C1(int x, int y)
* {
* this->x = x;
* this->y = y;
* }
* I think the former is smarter, how do you like it?
************************************************************************/
C1( const C1 aC1) // a copy constructor is defined
{
x = aC1->x ; y = aC1 -> y;
}
};

class C2{
C1 MyC1;
public:
C2(const C2& aC2) : MyC1(aC2.MyC1) {}
/* since C1 has an copy constructor, so its perfectly legal to construct
* MyC1 this way.(Compiler will provide a copy constructor for you is none
* is defined)
* Your may otherwise rewrite the above as:
* C2(const C2& aC2)
* {
* MyC1 = aC2.MyC1;
* }
* **********************************************************************/
};
cBeginner 2001-06-14
  • 打赏
  • 举报
回复
B::B(int I):i(I){}

就等于

B::B(int){
i = I;
}
孩皮妞野 2001-06-14
  • 打赏
  • 举报
回复
const的一些常见用法;
1。 const int SIZE_ARRAY 1000; //SIZE_ARRAY is not to be modified.

2. int Foo(const RECT& r); //Foo won't make any change to r

3. class Foo{
const static int i;
public:
void Bar()const; //Bar is qualified to access Foo's const member variables
};
ilovedavis 2001-06-14
  • 打赏
  • 举报
回复
const 在函数调用时,发挥不小的作用,保证参数的可靠性!
孩皮妞野 2001-06-14
  • 打赏
  • 举报
回复
不,你可以绕过编译器的安全检查, 不过吃亏的是你自己。
ggzzkk 2001-06-14
  • 打赏
  • 举报
回复
不管什么声明为CONST,那么在这个程序中是永远都不会改变了,是吗?
magicblue 2001-06-14
  • 打赏
  • 举报
回复
这样理解不错,《THINKING IN C++》上有更详细的讲述
孩皮妞野 2001-06-14
  • 打赏
  • 举报
回复
常量本质上还是一个变量( 他会占用内存),你声明一个常量,表明你不准备改变它的值,编译器会协助你不致因为失误而改变它。 你还可以把参数声明为const, 以免使用它的函数误修改它。
孩皮妞野 2001-06-14
  • 打赏
  • 举报
回复
常量是用来替代C中的
#define CONST_A 12345

的, 他提供了类型安全的好处。
ggzzkk 2001-06-14
  • 打赏
  • 举报
回复
感谢热心人ALNG,马上给你加分。

我有个问题不明白
class B {
int i;
public:
B(int I);
};
B::B(int I):i(I){} //这里:i(I)不明白,为什么要怎么写呢?资料上说是给int i初始化,请大家给我讲解一下好吗?谢谢!
孩皮妞野 2001-06-14
  • 打赏
  • 举报
回复
cBeginner, 这是一个visibility问题, 局部变量隐藏了同名的全局变量。与const的机制无关。


void main(){
int a = 1;
cout <<:: a<<'\n'<<a;
}

可以看出
cBeginner 2001-06-14
  • 打赏
  • 举报
回复
const int a = 123;
void main(){
int a = 1;
cout << a;
}
这时输出的结果是1,具体要看它的作用域来最后决定。
magicblue 2001-06-14
  • 打赏
  • 举报
回复
const int * const p = &a;
当a的定义中没有被const修饰时,a自身可以改变,但不能通过指针p改变a,也不能使p指向新的地址。
孩皮妞野 2001-06-14
  • 打赏
  • 举报
回复
const int a = 0x1234;

const int* const p=&a;

我觉得你说的简直就没错!
ggzzkk 2001-06-14
  • 打赏
  • 举报
回复
const int* const p=$a;
这个const类型的指针p所指向的地址是不变的吧?一直都是指向a的地址,而且a必须也是const类型?请问我的理解对吗?请指教,谢谢!

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧