Effective C++ 条款三 尽可能使用const
参考资料:http://blog.csdn.net/bizhu12/article/details/6672723 const的常用用法小结
1.用于定义常量变量,这样这个变量在后面就不可以再被修改
const int val = 90;
val = 100; 错误
2. 保护传参时参数不被修改,如果使用引用传递参数或按地址传递参数给一个函数,在这个函数里这个参数的值若被修改,
则函数外部传进来的变量的值也发生改变,若想保护传进来的变量不被修改,可以使用const保护
void fun1(const int &val)
{
//val = 10; //错误
}
void fun2(int &val)
{
val = 100; //正确
} 注意:对于引用修饰函数的参数,定义如下,如果是内部结构数据类型,我们一般不用 & 引用,而对于非结构类型,我们一般用引用。
3. 节约内存空间
#define PI 3.14
const double pi = 3.14;
double a = pi; //这时候才为Pi分配内存,不过后面再有这样的定义也不会再分配内存
double b = PI; //编译时分配内存
double c = pi; //不会再分配内存,
double d = PI; //编译时再分配内存
//const定义的变量,系统只为它分配一次内存,而使用#define定义的常量宏,能分配好多次,这样const就很节约空间
4.类中使用const修饰函数防止修改非static类成员变量
class a
{
public:
void fun() const
{
//a = 10; 错误,不可修改非static变量
b = 10; //正确,可以修改static变量
}
protected:
private:
int a;
static int b;
};
这一点主要是用来确定,哪个函数可以用来改动对象内容,而哪些函数不可以用来改变对象内容。
5、修饰指针
const int *a; int const *a; 效果一样,主要是*号与const的位置,在*左边,表示修饰物,在右边表示修饰指针。
int m = 10, j = 100;
const int *p1 = &m;//const在*左边,表示修饰物,*p不可变。p可变。
printf("%p,%d\n",p1,*p1);
//*p1 = 100;//错误,*p1不可变,但没规定p1不可变,p1可以指向其他的变量。
p1 = &j;
printf("%p,%d\n",p1,*p1);

在上面的程序中,我们也可以改变m的值,这是可以的。
6.修饰函数返回值,防止返回值被改变
const int fun();
7.修饰类的成员变量
这一点的话,初始化是个需要注意的地方。
如果是const 修饰的变量,可以不可以在类里面直接初始化,而是必须在构造函数初始化列表中初始化。而static修饰的变量,必须在类外初始化。当是const与static修饰的变量,必须在类外初始化。
class a
{
public:
// const int val = 100; 错误
const int val;
static int val1;
const static int val2 ;
//const static int val2 = 100; //这个不会 报错,对于常量可以在类内部初始化,也可以在类外部初始化。
a():val(100) //const变量必须在构造函数初始化列表中进行初始化
{
}
void fun() const
{
//a = 10; 错误,不可修改非static变量
b = 10; //正确,可以修改static变量
//val = 100; val是const类型,不可以被修改
}
protected:
private:
int a1;
static int b;
};
int a::b = 100;
int a::val1 = 100;//static变量必须在类外初始化
const int a::val2 = 100;//const static保留了static的特性,可以在类外初始化,也可以在类内部初始化
eg2:
class A
{
public:
const static int b = 10;
//const int c = 11; //error
//static int d = 12;//error
const int c;
static int d;
A():c(11)
{
// d = 12; error
}
protected:
private:
};
int A::d = 12;
调用:
A* aa = new A();
cout << aa ->b <<" "<< aa->c <<" "<<aa->d << endl;
8.const定义的对象变量只能作用于这个程序该C/C++文件,不能被该程序的其他C/C++文件调用
要想const定义的对象变量能被其他文件调用,定义时必须使用extern修饰为
extern const int val;
Effective C++ 条款三 尽可能使用const的更多相关文章
- Effective C++ -----条款03:尽可能使用const
如果关键字const出现在星号左边,表示被指物是常量:如果出现在星号右边,表示指针自身是常量:如果出现在星号两边,表示被指物和指针两者都是常量. char greeting[] = " he ...
- 《Effective C++》读书笔记 条款03 尽可能使用const 使代码更加健壮
如果你对const足够了解,只需记住以下结论即可: 将某些东西声明为const可帮助编译器侦测出错误用法,const可被施加于任何作用于内的对象.函数参数.函数返回类型.成员函数本体. 编译器强制实施 ...
- Effective C++_笔记_条款03_尽可能使用const
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 关键字const多才多艺,语法变化多端.关于const的基本用法 ...
- 条款21: 尽可能使用const
对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const,还有,两者都不指定为const: char *p = "hello"; ...
- 条款03 尽可能使用const
一.概述 使用const约束对象:可以获得编译器的帮助(指出相关出错的地方) const与成员函数:const重载.转型.避免代码重复 二.细节 1. 为什么有些函数要返回const对象(看上去没必要 ...
- 《Effective C++(第三版)》-笔记
1. 让自己习惯C++ 条款01: 视C++为一个语言联邦 1.1 C++ 是一个多重泛型编程语言(multiparadigm programming),支持:过程形式(procedural),面向对 ...
- Effective C++ 之 Item 3:尽可能使用 const
Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 3. 尽可能使用 const (Use const whenev ...
- C++学习书籍推荐《Effective C++ 第三版》下载
百度云及其他网盘下载地址:点我 编辑推荐 <Effective C++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)>前两个版本抓住了全世界无数程序员的目光.原因十分明显:S ...
- More Effective C++ 条款0,1
More Effective C++ 条款0,1 条款0 关于编译器 不同的编译器支持C++的特性能力不同.有些编译器不支持bool类型,此时可用 enum bool{false, true};枚举类 ...
随机推荐
- Codeforces Round #877 (Div. 2) B. - Nikita and string
题目链接:http://codeforces.com/contest/877/problem/B Nikita and string time limit per test2 seconds memo ...
- final,buaa_oo conclusion
UML系列作业设计架构 第13次作业 本单元的第一次作业中,涉及到了类图的解析.在着手做这单元作业的时候,需要将每一种 UmlElement 再封装,并在解析时,用 helper 单例来进行查询处理( ...
- Hive元数据启动失败,端口被占用
org.apache.thrift.transport.TTransportException: Could not create ServerSocket on address 0.0.0.0/0. ...
- xtu数据结构 G. Count the Colors
G. Count the Colors Time Limit: 2000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Jav ...
- BZOJ 2242 [SDOI2011]计算器 ——EXGCD/快速幂/BSGS
三合一的题目. exgcd不解释,快速幂不解释. BSGS采用了一种不用写EXGCD的方法,写起来感觉好了很多. 比较坑,没给BSGS的样例(LAJI) #include <map> #i ...
- [SCOI2005]最大子矩阵 (动态规划)
题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k(1≤n≤100,1≤m≤2 ...
- leetcode 347 priority,map的使用
主要是对次数进行排序,然后去前几个最大次数的值,输出即可 class Solution { public: vector<int> topKFrequent(vector<int&g ...
- Aragorn's Story(hdu3966)
题意:给一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路径上的所有点权值加上K D C1 C2 K:把C1与C2的路径上的所有点权值减去K Q C:查询节点编号为C ...
- Android SurfaceView与View
SurfaceView介绍 SurfaceView是视图(View)的继承类,这个视图里面内嵌了一个专门用于绘制的Surface.你可以控制这个Surface的格式和尺寸,而SurfaceView控制 ...
- hdu3491最小割转最大流+拆点
题意:求最小割,即求最大流即可.此题之关键为拆点(限制在点),每条边都是双向边,注意一下. 未1A原因:在拆点之后添加边的过程中,要注意,出去的是i`,进来的是i,!!所以,写addegde函数时候 ...