Effective C++ 条款三 尽可能使用const
2014-08-15 12:10
344 查看
参考资料:http://blog.csdn.net/bizhu12/article/details/6672723const的常用用法小结
1.用于定义常量变量,这样这个变量在后面就不可以再被修改
constintval=90;
val=100;错误
2.保护传参时参数不被修改,如果使用引用传递参数或按地址传递参数给一个函数,在这个函数里这个参数的值若被修改,
则函数外部传进来的变量的值也发生改变,若想保护传进来的变量不被修改,可以使用const保护
[code]{
[/code]
3.节约内存空间
[code]
[/code]
4.类中使用const修饰函数防止修改非static类成员变量
[code]{
[/code]
这一点主要是用来确定,哪个函数可以用来改动对象内容,而哪些函数不可以用来改变对象内容。
5、修饰指针
constint*a;intconst*a;效果一样,主要是*号与const的位置,在*左边,表示修饰物,在右边表示修饰指针。
[code]constint*p1=&m;//const在*左边,表示修饰物,*p不可变。p可变。
[/code]
在上面的程序中,我们也可以改变m的值,这是可以的。
6.修饰函数返回值,防止返回值被改变
constintfun();
7.修饰类的成员变量
这一点的话,初始化是个需要注意的地方。
如果是const修饰的变量,可以不可以在类里面直接初始化,而是必须在构造函数初始化列表中初始化。而static修饰的变量,必须在类外初始化。当是const与static修饰的变量,必须在类外初始化。
[code]{
b=10;//正确,可以修改static变量
//val=100;val是const类型,不可以被修改
[/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;
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;
相关文章推荐
- effective c++:条款21: 尽可能使用const
- Effective C++_笔记_条款03_尽可能使用const
- Effective C++:条款03:尽可能使用const
- effective c++ 条款21: 尽可能使用const
- Effective C++--条款03:尽可能使用const
- Effective C++学习笔记——条款03:尽可能使用const
- Effective C++ -----条款03:尽可能使用const
- effective C++ 条款 3:尽可能使用const
- Effective C++ 条款3——尽可能使用const
- [Effective C++] 条款03:尽可能使用const
- 【Effective C++】条款03-尽可能使用const
- 《Effective C++》学习笔记条款03 尽可能使用const
- 读书笔记《Effective c++》 条款03 尽可能使用const
- Effective C++ 条款03:尽可能使用const
- Effective C++学习3 条款03:尽可能使用const
- [Effective C++]条款03:尽可能使用const
- Effective C++学习笔记——条款03:尽可能使用const
- effective c++ 条款03 尽可能的使用const (const 的魅力)
- 条款03:尽可能使用const(Use const whenever possible.)
- 重读经典-《Effective C++》Item3:尽可能使用const