【C++】关于const的使用

摘自《effective c++》条款03

const可以修饰classes外部的global或namespace作用域中的常量、或文件、函数、或区块作用域(block scope)中被声明为static的对象。还可以修饰classes内部的static和non-static成员变量。

const对指针和迭代器的应用

面对指针,你可以指出指针自身、指针所指物,或两者都(或都不)是const。

char gretting[] = "Hello";
char* p = gretting; //non-const pointer, non-const data
const char* p = gretting; //non-const pointer, const data
char* const p = gretting; //const pointer, non-const data
const char* const p = gretting; //const pointer, const data

tips: 等号左边从右往左读,如const char* p 读作“p是一个指针,指向const的char对象“; 而const char* const p 读作“p是一个const的指针,指向一个const的char对象。”

//同一个意思,都代表指向const char 的非const指针。
const char* a;
char const* a;

STL迭代器是以指针为根据塑模出来的,所以迭代器的作用就像个T*指针。声明迭代器为const就像声明指针为const一样,表示这个迭代器不得指向不同的东西,但它所指的东西的值是可以改动的。如果希望迭代器所指的东西不可被改动,我们需要的是const_iterator。

#include<iostream>
#include<vector>
using namespace std;

vector<int> vec;
const vector<int>::iterator iter = vec.begin(); //是一个const的迭代器,不能指向不同的东西,但指向的东西可以改变
*iter = 10//ok
++iter; //error
vector<int>::const_iterator cIter = vec.begin(); //const_iterator,可以指向不同的东西,所指的东西不可改变
*cIter = 10; //error
++cIter; //ok
const对函数声明的应用

令函数返回一个常量值,往往可以降低因客户错误而造成的意外,而又不至于放弃安全性和高效性。

class Rational {...};
const Rational operator* (const Rational& lhs, const Rational& rhs);

如果返回值没有const限定的话,会出现这样的情况。

Rational a, b, c;
...
(a * b) = c; //即对a和b的乘积再次赋值

这样的行为是很奇怪的,为了避免用户有这样的行为,最好将返回类型定义为const。

const成员函数

将const实施于成员函数的目的,是为了确认该成员函数可作用于const对象身上。
这类成员函数很重要,第一,它们使classes接口比较容易被理解;第二,它们使“操作const对象”成为可能。

两个成员函数如果只是常量性不同,可以被重载。

关于成员函数的概念,有两个流行概念:bitwise constness 和 logical constness.(具体理念未理解清楚。)

  • 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本课避免代码重复。(详细的理解与代码有待日后补充)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值