关闭

【C++】关于const的使用

标签: c语言
148人阅读 评论(0) 收藏 举报
分类:

摘自《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
查看评论

c++中 const修饰指针的理解与记忆法

经常混淆c++中的const修饰指针的作用,今天看到一个blog说的很好”以*为界,左物右指“,因此转载过来当笔记。 当使用带有指针的const时,有两种选择:1、或者const修饰指针正指向的对象,2、const修饰存储在指针本身的地址。 1 指向const的指针 使...
  • code_robot
  • code_robot
  • 2015-01-05 17:33
  • 682

C/C++——const用法完整总结

C/C++——const用法完整总结
  • Linux_ever
  • Linux_ever
  • 2016-05-08 10:49
  • 1644

C++中const的使用常对象和长对象成员

有关常对象和常对象成员 在c++编程中如果要让所编的程序更安全,就要用到一些保护机制。 常对象 即对象中的所有数据成员在引用时不能被改变的对象。定义如下: class Student{ public: int a; int b; int c; public: Studen...
  • little_water
  • little_water
  • 2013-08-19 00:20
  • 686

c++ 函数形参关于const和引用

1 非引用的 (const形参 或者非const形参),实参既可以是const 也可以是非const    a 如果函数使用非引用的非const形参,既可以传递const实参,也可以传递非const实参。因为初始化复制了初始化式的值,所以可以const对象初始化非const对...
  • summer070825
  • summer070825
  • 2016-10-26 10:31
  • 635

C++回顾之const对象、const成员函数、mutable类型

总结const的各种用法,主要讲述const对象,及const 成员函数,还有mutable修饰的数据成员
  • ab198604
  • ab198604
  • 2014-02-08 11:02
  • 3495

C++函数中const形参与非const形参

关于C++函数中形参、实参const问题,比较绕,在此特意总结归纳一下: 先看一个例子: void swap1( int *x, int *y){ int temp=*x; *x=*y; *y=temp; }int main(){int a=10;int b=9;int *p=&...
  • ziyanguang1989
  • ziyanguang1989
  • 2013-11-14 17:09
  • 1139

C、C++中使用const提高程序的健壮性和效率

C、C++中使用const提高程序的健壮性和效率
  • rl529014
  • rl529014
  • 2016-08-30 02:56
  • 1191

C++关于类成员函数在参数列表后加const的作用,以及使用条件

C++关于类成员函数在参数列表后加const的作用,以及使用条件
  • u014452891
  • u014452891
  • 2017-07-25 17:06
  • 406

c++中const的用法和注意事项

1、const修饰成员变量: 在c++中在定义常量是通常会用到的const,但是对于const的位置不同通常是表示不同的作用,而且之间的相互作用通常会造成混淆,下面作简要注解:     1)、直接修饰普通常量没有什么要点问题。     2...
  • m0_37338590
  • m0_37338590
  • 2017-03-10 11:34
  • 538

给一道关于const的面试题

/*题目:请声明一个指针,其所指向的内存地址不能改变,但内存中的值可以被改变 A.const int const *x = &y; B.int * const x = &y; C.const int *x = &y; D.const int * const x = &...
  • derkampf
  • derkampf
  • 2016-06-07 22:00
  • 510
    个人资料
    • 访问:4098次
    • 积分:185
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论