C++::const的使用法总结

摘要

const 是C++一个强大的工具,可以帮助我们提高程序的健壮性,减少运行期可能发生的错误,但是,对于初学者来说,const也是相对难以掌握的,我将对const进行一下总结。


const 变量

普通的内置对象

const int i=0;
const int& j=i;

const指针

const int *i = new int[30];
//const 修饰的是(*i), 所以(*i),也就是值本身不可变,也就是一个low-level const

int * const i = new int[30];
//const 修饰的是(i), 所以(i),也就是指针本身不可变,也就是一个top-level const

const 返回值函数

  • by-value
class v{}
const v func(int i){
    return v(i); //返回一个对象,编译器会进行优化
}
  • by-reference
class v{}
const v& func(int i){
    v c(i);
    return c; //很蠢,因为c在离开该函数后已经被析构了
}
  • by-pointer
class v{}
const v* func(int i){
    return new v(i); //也很蠢,开发者还要记得delete它
}

class与const

在这一章节中,将重点介绍class,也就是类与const的一些应用

首先,我们定义一个类constTest作为我们测试的舞台

class constTest
{
public:
    const int c_int;
    int _int;

public:
    constTest();
    explicit constTest(int);

    int get_cInt() const;
    int get_int();
};

const 成员变量

const成员变量的声明很简单,只需要在成员变量类型前加上const即可

const int c_int;

由于const成员变量的值需要在对象初始化阶段时被定义,因此const成员变量必须通过成员变量赋值列来完成定义

constTest::constTest(int i):c_int(i),_int(i)
{}

这种写法十分高效,比以下写法好的多

constTest::constTest(int i):c_int(i)
{
    this->_int=i;
}

但是要注意的是赋值的顺序最好与声明的顺序一致,防止某些构造函数参数间的依赖性:

class A{
public:
    A(int a):a(a);
}
class C{
public:
    C(A a):a(a);
}

class B{
public:
    int num_a;
    A a;
    C c;
    B(int);
}

B::B(int num):C(this->num_a),num_a(num),A(this->C) //这句话有bug哟~
{}

const 成员函数

在class中声明const成员函数,只需要在函数后加一个const即可:

int get_cInt() const;

被声明为const的成员函数:

  • 可以访问所有的成员变量;
  • 不可以对成员变量进行赋值;
  • 不可以调用非const的成员函数(因为非const的成员函数有权利对成员变量进行赋值)

没有被声明为const的成员函数:

  • 可以访问所有的成员变量;
  • 可以对非const成员变量进行赋值;
  • 可以调用所有的成员函数

const对象

我们构造一个普通对象和一个const对象

const constTest c1(1);
constTest c2(1);

被声明为const的对象

  • 可以访问所用的成员变量
  • 不可以进行任何赋值
  • 不可以调用非const成员函数

没有被声明为const的对象

  • 可以访问所用的成员变量
  • 可以调用所有成员函数

参考文献

《Effective C++》

《More Effective C++》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《exceptional c++:47个c++工程难题、编程问题和解决方案(中文版)》讲述如何用标准c++进行企业级的软件开发,通过“问题/解答”的方式,启发读者思考,帮助了解隐藏在问题背后的设计思想,以及各种编程指导原则适用的场合。本书列出的条款涵盖了许多方面的主题,尤其对异常安全性、类和模块的合理设计,正确的代码优化,以及编写符合c++标准的可移植代码进行了深入的讨论。   《exceptional c++:47个c++工程难题、编程问题和解决方案(中文版)》适于有一定c++编程基础的读者阅读。 目录 《exceptional c++:47个c++工程难题、编程问题和解决方案(中文版)》 1 泛型程序设计与c++标准库 1 条款1:迭代器难度系数 1 条款2:大小写不敏感的字符串——之一 5 条款3:大小写不敏感的字符串——之二 9 条款4:可重用性最高的泛型容器——之一 12 条款5:可重用性最高的泛型容器——之二 13 条款6:临时对象 22 条款7:标准库的使用(或者,再论临时对象) 28 2 异常安全性相关的问题与技术 31 条款8:编写异常安全的代码——之一 32 条款9:编写异常安全的代码——之二 37 条款10:编写异常安全的代码——之三 40 条款11:编写异常安全的代码——之四 47 条款12:编写异常安全的代码——之五 50 条款13:编写异常安全的代码——之六 56 条款14:编写异常安全的代码——之七 62 条款15:编写异常安全的代码——之八 65 条款16:编写异常安全的代码——之九 68 条款17:编写异常安全的代码——之十 73 条款18:代码的复杂性——之一 75 条款19:代码的复杂性——之二 79 3 类的设计与继承 85 条款20:类的编写技巧 85 条款21:虚函数的重载 93 条款22:类之间的关系——之一 99 条款23:类之间的关系——之二 103 条款24:继承的使用和滥用 110 条款25:面向对象程序设计 121 4 编译器防火墙和pimpl惯用法 123 条款26:将编译期依赖性降到最低——之一 123 条款27:将编译期依赖性降到最低——之二 127 条款28:将编译期依赖性降到最低——之三 132 条款29:编译防火墙 135 条款30:fast pimpl惯用法 138 5 名字查找、名字空间和接口规则 148 条款31:名字查找与接口规则——之一 148 条款32:名字查找与接口规则——之二 152 条款33:名字查找和接口规则——之三 162 条款34:名字查找与接口规则——之四 167 6 内存管理 176 条款35:内存管理——之一 176 条款36:内存管理——之二 179 条款37:auto_ptr 186 7 误区、陷阱以及错误的惯用法 201 条款38:对象标识 201 条款39:自动转换 204 条款40:对象的生存期——之一 206 条款41:对象的生存期——之二 209 8 其他主题 219 条款42:变量的初始化 219 条款43:正确使用const 222 条款44:类型转换 231 条款45:bool 238 条款46:转调函数 242 条款47:控制流程 244 后记 254 参考书目 256

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值