条款03:尽肯使用const
定义常量
- define 是一个Compile-Time的概念,它的生命周期止于编译器期,它存在与程序的代码段,在实际程序中它只是一个常数、一个命令中的参数、并没有实际的存在
- const常量存在于程序的数据段,并在堆栈分配了空间。const常量是一个Run-Time的概念,它在程序中确确实实地存在并可以被调用、传递。const常量有数据类型,而宏常量没有数据类型。编译器可以对const常量进行类型安全检查
const int val = 5;
const char* const p = "hello";
const std::string str{ "world" };
修饰指针变量
当const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量
const char * p;(此处可以不初始化) p指向的内容是常量
char *const p; p本身是常量
const char * const p; p和p指向的内容都是常量
修饰引用
int num1 = 8;
const int & num2 = num1; //常引用,不能通过引用去修改被引用的指(引用必须初始化)
int & const num3 = num1; //error
const int & const num4 = num1; //error
修饰函数
修饰函数参数
如果不需要改动参数或local对象,尽量加上const:
- 防止创建副本,减少内存开销
- 防止对引用参数进行修改
void func(const std::string & str);
修饰函数返回值
令函数返回一个常量指,往往可以降低因客户错误而造成的意外,而不至于放弃安全性和高效性
const int func(void);
在类中的使用const
修饰成员变量
- 常成员变量,通过构造函数对其初始化,且只能通过初始化列表的方式初始化
- 一经初始化就不可改变
class A{
public:
/* A(int a, std::string str){
m_a = a;
m_name = str;
} */
A(int a, std::string str):m_a(a),m_name(str)
{
}
public:
const int m_a;
const std::string & m_name;
};
修饰成员函数
const修饰成员函数,本质修饰的是this指针;
- 使class的接口比较容易被理解;清楚的知道哪个函数可以改动对象内容而哪个函数不行
- 使操作const对象成为可能
- 两个成员函数如果只是常量性不同,可以被重载
class TextBlock{
public:
const char& operator[](std::size_t position)const
{
return text[position];
}
char& operator[](std::size_t position)
{
return
const_cast<char&>( //将op[]的返回值移除const
static_cast<const TextBlock&>(*this)[position] //为*this加上const,调用[]
);
}
private:
std::string text;
};
修饰对象
常对象只能调用常成员函数;普通对象既可以调用常成员函数也可以调用普通成员函数
class A{
public:
/* A(int a, std::string str){
m_a = a;
m_name = str;
} */
A(int a, std::string str):m_a(a),m_name(str)
{
}
void get()const
{
std::cout << "call const A& A::get()const" << std::endl;
std::cout << this->m_a << ' ' << this->m_name << ' ' << std::endl;
}
void get()
{
std::cout << "call A& A::get()" << std::endl;
std::cout << this->m_a << ' ' << this->m_name << ' ' << std::endl;
// return static_cast<const A&>(*this).get();
}
public:
const int m_a;
const std::string & m_name;
};
void test()
{
A a(8,"hello");
a.get();
const A ca(9, "world");
ca.get();
}
- 将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类、成员函数本体
- 编译器强制实施bitwise constness,但你编写程序是应该使用“概念上的常量性”(conceptual constness)
- 当const 和 non-const成员函数有着实质等价的实现时,令non-const版本调用const可避免代码重复
条款03:尽肯使用const的更多相关文章
- 条款03:尽可能使用const
目录 1. 总结 2. const对象 3. const函数返回值和函数参数 4. const成员函数 const成员函数的重要性 bitwise constness logical constnes ...
- Effective C++ 条款03:尽可能使用const
场景一 用于修饰指针 char greeting[] = "Hello"; char* p = greeting; // non-const pointer, non-const ...
- 【Effective C++ 读书笔记】条款03: 尽量使用 const
关键字const多才多艺,变化多端却不高深莫测. const 修饰指针 面对指针, 你可以指出 指针自身.指针所指物.或者两者都不是 const. 如果关键字 const 出现在星号左边,表示被指物是 ...
- 《Effective C++ 》学习笔记——条款03
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- 【Effective C++ 读书笔记】条款02: 尽量以 const, enum, inline 替换 #define
条款02: 尽量以 const, enum, inline 替换 #define 这个条款或许可以改为“宁可以编译器替换预处理器”. 编译过程: .c文件--预处理-->.i文件--编译--&g ...
- Effective C++ -----条款03:尽可能使用const
如果关键字const出现在星号左边,表示被指物是常量:如果出现在星号右边,表示指针自身是常量:如果出现在星号两边,表示被指物和指针两者都是常量. char greeting[] = " he ...
- 《Effective C++》读书笔记 条款03 尽可能使用const 使代码更加健壮
如果你对const足够了解,只需记住以下结论即可: 将某些东西声明为const可帮助编译器侦测出错误用法,const可被施加于任何作用于内的对象.函数参数.函数返回类型.成员函数本体. 编译器强制实施 ...
- 条款03 尽可能使用const
一.概述 使用const约束对象:可以获得编译器的帮助(指出相关出错的地方) const与成员函数:const重载.转型.避免代码重复 二.细节 1. 为什么有些函数要返回const对象(看上去没必要 ...
- 读书笔记_Effective_C++_条款二:尽量以const, enum, inline替换#define
其实这个条款分成两部分介绍会比较好,第一部分是用const和enum替换不带参的宏,第二部分是用inline替换带参的宏. 第一部分:用const和enum替换不带参宏 宏定义#define发生在预编 ...
随机推荐
- 架构——android架构演进概述
随着业务的发展和技术的变更,Android开发也经历了以下几个发展阶段: 看似高大上的名词,其实遵循着最简单的原则:分而治之(如何划分就是"架构",简单的事情如何串在一起就是&qu ...
- 非后端开发Mysql日常使用小结
数据库的五个概念 数据库服务器 数据库 数据表 数据字段 数据行 那么这里下面既是对上面几个概念进行基本的日常操作. 数据库引擎使用 这里仅仅只介绍常用的两种引擎,而InnoDB是从MySQL 5.6 ...
- node的重点学习笔记(1)————node
node的重点学习笔记(1)----node 提到node就必须提一下他的npm了,npm是世界上最大的开放源代码的生态系统.通俗来说这就如同亚马逊丛林,要啥物种有啥物种,一个巨大的生态圈,里面有一堆 ...
- 2. spring 应用之IOC
本文是作者原创,版权归作者所有.若要转载,请注明出处 我们知道Spring Framework 最重要的功能就是IoC (Inversion of Control ),也叫DI(dependency ...
- 第10项:重写equals时请遵守通用约定
重写equals方法看起来似乎很简单,但是有许多重写方式会导致错误,而且后果非常严重.最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下,类的每个实例都只能与它自身相等.如果满足了以 ...
- SpringCloud教程一:eureka注册中心(Finchley版)
一.spring cloud简介 本阶段学习教程Spring Boot版本2.0.3.RELEASE,Spring Cloud版本为Finchley.RELEASE. Finchley版本的官方文档如 ...
- RAID5 配置,3块磁盘,2快备份
1. 在虚拟机中再添加5块硬盘: 2. 用fdisk -l 可以查看当前虚拟机磁盘情况. 3. 使用mdadm命令创建RAID5,名称为”/dev/md0″. -C代表创建操作,-v显示创建过程,-n ...
- python requests简单接口自动化
get方法 url:显而易见,就是接口的地址url啦 headers:定制请求头(headers),例如:content-type = application/x-www-form-urlencode ...
- Echart:前端很好的数据图表展现工具+demo
官网: http://echarts.baidu.com/index.html 通过一个简单的小Demo介绍echart的使用:demo均亲测可以运行 demo1: 1.新建一个echarts.ht ...
- [CF467D] Fedor and Essay
After you had helped Fedor to find friends in the «Call of Soldiers 3» game, he stopped studying com ...