您的位置:首页 > 编程语言 > C语言/C++

Effective C++ 条款三 尽可能使用const

2014-08-15 12:10 344 查看
参考资料:http://blog.csdn.net/bizhu12/article/details/6672723const的常用用法小结

1.用于定义常量变量,这样这个变量在后面就不可以再被修改

constintval=90;

val=100;错误

2.保护传参时参数不被修改,如果使用引用传递参数或按地址传递参数给一个函数,在这个函数里这个参数的值若被修改,

则函数外部传进来的变量的值也发生改变,若想保护传进来的变量不被修改,可以使用const保护

voidfun1(constint&val)

[code]{
//val=10;//错误

}


voidfun2(int&val)

{

val=100;//正确

}

注意:对于引用修饰函数的参数,定义如下,如果是内部结构数据类型,我们一般不用&引用,而对于非结构类型,我们一般用引用。

[/code]

3.节约内存空间


#definePI3.14

[code]
constdoublepi=3.14;


doublea=pi;//这时候才为Pi分配内存,不过后面再有这样的定义也不会再分配内存


doubleb=PI;//编译时分配内存


doublec=pi;//不会再分配内存,


doubled=PI;//编译时再分配内存


//const定义的变量,系统只为它分配一次内存,而使用#define定义的常量宏,能分配好多次,这样const就很节约空间

[/code]

4.类中使用const修饰函数防止修改非static类成员变量


classa

[code]{
public:

voidfun()const

{

//a=10;错误,不可修改非static变量

b=10;//正确,可以修改static变量

}

protected:

private:

inta;

staticintb;

};

[/code]

这一点主要是用来确定,哪个函数可以用来改动对象内容,而哪些函数不可以用来改变对象内容。

5、修饰指针

constint*a;intconst*a;效果一样,主要是*号与const的位置,在*左边,表示修饰物,在右边表示修饰指针。


intm=10,j=100;

[code]constint*p1=&m;//const在*左边,表示修饰物,*p不可变。p可变。
printf("%p,%d\n",p1,*p1);

//*p1=100;//错误,*p1不可变,但没规定p1不可变,p1可以指向其他的变量。

p1=&j;

printf("%p,%d\n",p1,*p1);

[/code]





在上面的程序中,我们也可以改变m的值,这是可以的。

6.修饰函数返回值,防止返回值被改变

constintfun();

7.修饰类的成员变量

这一点的话,初始化是个需要注意的地方。

如果是const修饰的变量,可以不可以在类里面直接初始化,而是必须在构造函数初始化列表中初始化。而static修饰的变量,必须在类外初始化。当是const与static修饰的变量,必须在类外初始化。




classa

[code]{
public:


//constintval=100;错误

constintval;

staticintval1;

conststaticintval2;


//conststaticintval2=100;//这个不会报错,对于常量可以在类内部初始化,也可以在类外部初始化。

a():val(100)//const变量必须在构造函数初始化列表中进行初始化

{


}


voidfun()const

{

//a=10;错误,不可修改非static变量

b=10;//正确,可以修改static变量

//val=100;val是const类型,不可以被修改

}

protected:

private:

inta1;

staticintb;

};


inta::b=100;

inta::val1=100;//static变量必须在类外初始化

constinta::val2=100;//conststatic保留了static的特性,可以在类外初始化,也可以在类内部初始化

[/code]

eg2:

classA
{
public:
conststaticintb=10;
//constintc=11;//error
//staticintd=12;//error
constintc;
staticintd;
A():c(11)
{
// d=12;error
}
protected:
private:
};

intA::d=12;

调用:

A*aa=newA();
cout<<aa->b<<""<<aa->c<<""<<aa->d<<endl;

8.const定义的对象变量只能作用于这个程序该C/C++文件,不能被该程序的其他C/C++文件调用

要想const定义的对象变量能被其他文件调用,定义时必须使用extern修饰为

externconstintval;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: