const 用法


第一 const的作用

   (1)可以定义const常量         例如:

             const int Max=100;

             int Array[Max];        

const对默认是定义它文件的局部变量,此变量只存在于该文件中不会被其他文件访问,通过制定const变量为extern,就可以在整个程序中使用const对象。

   (2)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。

        还是上面的例子,如果在函数体内修改了i,编译器就会报错;

        例如: 

             void f(const int i) { i=10;//error! }

   (3)修饰类的成员函数:

        const修饰符也可以修饰类的成员函数,格式如下:

            class ClassName 

         {

             public:

                  int Fun() const;

                    .....

             };

        这样,在调用函数Fun时就不能修改类里面的数据 

若在这种情况下,想要改变类的成员变量,只需用mutalbe 来修饰该成员变量   

   (4)修饰指针

        const int *A;   或  int const *A; //const修饰指向的对象,A可变,A指向的对象不可变

        int *const A;              //const修饰指针A,     A不可变,A指向的对象可变 

        const int *const A;      //指针A和A指向的对象都不可变

   (5)修饰引用

        const double & v;      该引用所引用的对象不能被更新

  (6)修饰函数的返回值:

        const修饰符也可以修饰函数的返回值,是返回值不可被改变,格式如下:

            const int Fun1(); 

            const MyClass Fun2();

 

(8)放在类内部的常量有什么限制?

  

        class A

        {

         private:

           const int c3 = 7;               // err

           static int c4 = 7;               // err

           static const float c5 = 7;  // err

          ......

  };

 初始化类内部的常量

        1 初始化列表:

         class A

         {

          public:

                A(int i=0):test(i) {}

          private:

                const int i;

          };

         2 外部初始化,例如:

         class A

         {

          public:

                A() {}

          private:

                static const int i;  

          };

          const int A::i=3;  

另外一种方式:

        class A

         {

          public:

                A() {}

          private:

                static const int i=3;  

          };

(9)const 对象默认为文件的局部变量

 

第五题   const引用

 Const对象是指向const对象的引用

const int ival=1024;

const int &refval=ival;//正确const引用用const对象来初始化

Int &ref2=ival;//错误,不能把const对象付给一个非const引用

const 引用可以初始化为不同类型的对象或者初始化为右值,如下所示:

int i=42;

const int &r=i;

const int &r2=r+i;

cout<<r2<<endl;

double dval=3.14;

const int &j=dval;

cout<<j<<endl;

const引用只能绑定到与该引用同类型的对象

double  i=42.5;

const int &temp=i;

cout<<temp<<endl; 成功

double  i=42.5;

int &temp=i;

cout<<temp<<endl; 失败

第六题 const指针

1. 指向const对象的指针

 Const double *cptr;这里cptr是指向double类型的const指针。不能通过cpt改变所指对象的值,定义时不需要初始化。

Const int a=3;

Const double *cptr=&a;

*cptr=43;//这是错误的

Cptr一经赋值就不能改变其所指对象的值。允许把非const对象的地址赋给指向const对象的指针。

Doube dval=3.14

Const 形参

在调用函数时,如果该函数使用非引用的非const形参,则可以给该函数传递const实参,相当于用const实参来初始化非const对象

void func(int i)

{

 cout<<i<<endl;

}

int main()

{

const int a=3;

func(a);

getchar();

return 0;

}

如果形参是const 形参,则实参仍然既可以const对象,也可以是非const对象

void func(const int i)

{

 cout<<i<<endl;

}

int main()

{

int a=3;

func(a);

getchar();

return 0;

}

引用形参

普通的形参修改的仅是局部副本。

利用const引用避免复制,并且避免了改变值。

int func(const string &s1,const string &s2)

{

return s1.size()<s2.size()?1:-1;

}

int main()

{

string s1("hello"),s2("what");

int isShort=func(s1,s2);

cout<<isShort<<endl;

getchar();

return 0;

}

非const引用形参只能与完全同类型的非const对象关联。

void func(int &a)

{

cout<<a<<endl;

}

int main()

{

//short a=10; //error

int a=10; 

func(a);

getchar();

return 0;

}

应该将不需要修改的引用形参定义为const引用,普通的非const引用形参在使用时不太灵活,这样的形参既不能使用const对象初始化,也不能使用字面值或产生右值的表达式实参初始化。

void func(const int &a) //如果这儿是非const引用形参则会报错

{

cout<<a<<endl;

}

int main()

{

func(10);

getchar();

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值