C++博客 :: 首页 :: 联系 ::  :: 管理
  163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

常用链接

留言簿(44)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 368052
  • 排名 - 52

最新评论

阅读排行榜

评论排行榜

      const是C语言的一种关键字,起受保护,防止以外的变动的作用!可以修饰变量,参数,返回值,甚至函数体。const可以提高程序的健壮性,你只管用到你想用的任何地方。
(一)const修饰参数。const只能修饰输入参数。
   1、如果输入参数是指针型的,用const修饰可以防止指针被意外修改。
   2、如果参数采用值传递的方式,无需const,因为函数自动产生临时变量复制该参数。
   3、非内部数据类型的参数,需要临时对象复制参数,而临时对象的构造,析构,复制较为费时,因此建议采用前加const的引用方式传递非内部数据类型。而内部数据类型无需引用传递。

(二)const修饰函数返回值。
   1、函数返回const指针,表示该指针不能被改动,只能把该指针赋给const修饰的同类型指针变量。
   2、函数返回值为值传递,函数会把返回值赋给外部临时变量,用const无意义!不管是内部还是非内部数据类型。
   3、函数采用引用方式返回的场合不多,只出现在类的赋值函数中,目的是为了实现链式表达。

(三)const+成员函数。任何不修改数据成员的函数都应该声明为const类型,如果const成员函数修改了数据成员或者调用了其他函数修改数据成员,编译器都将报错!
class stack
{
public:
void push(int elem);
void pop(void);
int  GetCount(void) const ;
private:
 int m_num;
 int m_date[10];
};

int stack::GetCount(void)   const
{
 m_num++;
}


编译器输出错误信息:error C2166: l-value specifies const object。

(四)const 修饰变量,表示该变量不能被修改。
    1、const char  *p 表示 指向的内容不能改变
    2、char * const p,就是将P声明为常指针,它的地址不能改变,是固定的,但是它的内容可以改变。
    3、这种const指针是前两种的结合,使得指向的内容和地址都不能发生变化.
         const double pi = 3.14159;
         const double *const pi_ptr = π
posted on 2008-01-13 21:20 sdfasdf 阅读(13895) 评论(7)  编辑 收藏 引用 所属分类: C++

Feedback

# re: const的作用 2008-01-14 05:44 TheAnswer
随便说几点。

1.const是C++中的关键字,C中的const是鉴戒C++定义的关键字,但是C中的const与C++比退化的很厉害,几乎就是没啥用。

2.从语义上来讲,函数参数中的指针不应该用const修饰,既然用指针传递,就应该意味着参数会被修改,如果函数体不修改参数,应该用const引用或者传值。

3.函数返回值的时候,需要区分是否为内置类型,内置类型的返回值是一个右值,可以保证其不会被修改,但是返回自定义类型的时候,如果不加const,函数返回值是可以被赋值的,虽然不符合常理,但是语法上是没问题的。
例如 A func(int);
func(3) = A();
编译完全可以通过,你可以试一下。 :)  回复  更多评论
  

# re: const的作用 2013-01-18 12:34 杜晶
@TheAnswer
20: int main(int argc, char* argv[])
21: {
00401130 push ebp
00401131 mov ebp,esp
00401133 push 0FFh
00401135 push offset __ehhandler$_main (00412ef9)
0040113A mov eax,fs:[00000000]
00401140 push eax
00401141 mov dword ptr fs:[0],esp
00401148 sub esp,54h
0040114B push ebx
0040114C push esi
0040114D push edi
0040114E lea edi,[ebp-60h]
00401151 mov ecx,15h
00401156 mov eax,0CCCCCCCCh
0040115B rep stos dword ptr [edi]
22: func(3)=A();
0040115D lea ecx,[ebp-14h]
00401160 call @ILT+5(A::A) (0040100a)
00401165 mov dword ptr [ebp-58h],eax
00401168 mov eax,dword ptr [ebp-58h]
0040116B mov dword ptr [ebp-5Ch],eax
0040116E mov dword ptr [ebp-4],0
00401175 mov ecx,dword ptr [ebp-5Ch]
00401178 mov esi,dword ptr [ecx]
0040117A push 3
0040117C lea edx,[ebp-10h]
0040117F push edx
00401180 call @ILT+0(func) (00401005)
00401185 add esp,8
00401188 mov dword ptr [ebp-60h],eax
0040118B mov eax,dword ptr [ebp-60h]
0040118E mov dword ptr [eax],esi
00401190 lea ecx,[ebp-10h]
00401193 call @ILT+10(A::~A) (0040100f)
00401198 mov dword ptr [ebp-4],0FFFFFFFFh
0040119F lea ecx,[ebp-14h]
004011A2 call @ILT+10(A::~A) (0040100f)
23:
24: return 0;
004011A7 xor eax,eax
25: }

调试汇编下你们就知道了,func(3) = A();之所以可以编译通过,是因为这句话相当于,A temp1=A::A(); A temp2=func(3); temp2=temp1;  回复  更多评论
  

# re: const的作用 2013-01-18 13:07 杜晶
@TheAnswer
你说的:内置类型的返回值是一个右值,可以保证其不会被修改,倒是C编译器在编译语法检查时就实现了的,我之所以同意你这个说法,是因为下面的代码完全可以通过编译:
int func(int i){ return i;}
int main(int argc, char* argv[])
{
const int a=func(1);
func(2);
__asm{
mov a, eax;//修改a常量,说明汇编级并没有所谓的左右值之说。
}
return 0;
}

左右值的编译错误完全是在C/C++编译器做语法检查的时候就报错了。  回复  更多评论
  

# re: const的作用 2013-01-18 13:13 杜晶
@TheAnswer
另外楼主的描述我比较赞同,原因是C语言里的函数定义时是不能在函数名后面加const的,加了反而是语法错误,C++中也只有类的成员函数名后才能加这个const,其他的时候const要加也只能加在返回值或者参数(变量)定义前,楼主说的完全正确。
  回复  更多评论
  

# re: const的作用 2013-01-18 13:36 杜晶
又做了一个实验,内容如下,应该更能说明问题:
情况一:编译通过!
class A
{
const int m_i;
public:
A(): m_i(0){}
~A(){}
/*const*/ A GetI(int i) const {return *this;}
A operator =(A& a){return a;}
};

int main(int argc, char* argv[])
{
A a;
/*(const class A)*/a.GetI(1)=/*(const class A)*/a.GetI(2);
printf("Hello World!\n");
return 0;
}
  回复  更多评论
  

# re: const的作用 2013-01-18 13:37 杜晶
情况二:编译报错error C2678: binary '=' : no operator defined which takes a left-hand operand of type 'const class A' (or there is no acceptable conversion)

class A
{
const int m_i;
public:
A(): m_i(0){}
~A(){}
const A GetI(int i) const {return *this;}
A operator =(A& a){return a;}
};

int main(int argc, char* argv[])
{
A a;
/*(const class A)*/a.GetI(1)=/*(const class A)*/a.GetI(2);
printf("Hello World!\n");
return 0;
}
  回复  更多评论
  

# re: const的作用 2013-01-18 13:40 杜晶
情况三:编译通过,强行通知C/C++编译器这个语法检查正确。
class A
{
const int m_i;
public:
A(): m_i(0){}
~A(){}
const A GetI(int i) const {return *this;}
A operator =(A& a){return a;}
};

int main(int argc, char* argv[])
{
A a;
(const class A)a.GetI(1)=(const class A)a.GetI(2);
printf("Hello World!\n");
return 0;
}
  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理