| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C++经验(一)-- const关键字的用法 -> 正文阅读 |
|
[C++知识库]C++经验(一)-- const关键字的用法 |
const允许我们指定一个语义约束(不该被改变的对象),编译器会强制实施这项约束。 const的作用也是比较多的。
判断上面的类型,主要是看关键字const出现在指针 * 的左边还是右边,如果在左边,则表示指针所指的对象是const类型,如果出现在右边,则表示指针本身是const类型。 很多时候,如果指针指向的对象是常量,我们经常会碰到两种实现方式。
前面我们在学习stl的时候也提到过,stl中的迭代器其实相当于是一个指针(T*)。而stl中也已经声明了相应的const类型的迭代器(const_iterator)。这个时候我们需要注意const iterator。 使用const_iterator的场景一般都出现我们不想改变容器中的值,但需要遍历容器的时候。
上面的例子中,我们分别定义了两个迭代器 iter 和 citer,对应const类型之后也就是 T* const 和 const T*。也就是说, iter 相当于是一个 citer相当于是一个 让函数返回一个常量值,往往会降低编写代码所犯的低级错误而造成的意外。比如下面这个例子:
上面的例子我们返回了一个const类型的Widget对象,为什么呢?
如果我们出现了上面这样的代码,我们可能是很难理解的吧。猜测一下这行代码的本意应该是两个对象相加之后和对象c对比较,而不是进行赋值。因为在这儿的赋值操作没有任何意义。 但是如果我们将operator+的返回值声明为const类型,则可以避免这种错误。题外话,如果我们需要和一个常量进行比较,习惯性地将常量写在比较 == 的左边,也可以避免这种错误。 我们在写代码的时候,经常会碰到const类型的成员函数,其目的是为了确认该成员函数可作用于const对象上。之所以重要,有两个理由:
我们也经常会有一个经验,使用pass by reference-to-const(const引用)方式传递对象,这样可以提高程序效率。 我们看下面这个例子:
上面的例子中,我们对类TextBlack提供了两个不同返回类型的operator[]方法。并且对这两种方法都进行了测试。 上面被注释掉的操作 同样的,针对返回值是
这是因为如果函数的返回类型是内置类型,改动函数的返回值是不合法的。纵使合法,C++以by-value返回对象,意味着被改动的其实是 b.text[0]的副本,而不是其本身。 如果我们稍微修改下上面的例子呢?
这样会不会const类型cb的值呢?实惠改变的。 上面我们一直在强调的是在const成员函数中不能修改成员变量的值。 那么看下下面的例子。
上面的例子我们定义了一个TextBlack类的const成员函数length,但是在该函数的实现中对成员变量m_len进行了赋值,这是不允许的。 其实m_len的修改对于TextBlack类的const对象来说都是可接受的,但是在编译的时候,编译器是不允许的。 这种情况下,我们可以利用C++中和const有关的一个摆动场
在实际编写代码的时候,我们经常会顾及代码的简洁度,其实在上面的第一个例子中,虽然只有简单的一行,也能看到某些代码其实是有重复的,假设我们在实际应用中,需要同时实现下面的函数。
其中对于一些其他的操作,在const和non-const函数中是一样的,如果写两遍,代码会很长,并且重复性的代码比较多,这可能是我们在很多时候是不能接受的。最简单的方式可能就是将这些操作抽出来,做一个另外的成员函数,然后在这两个函数中调用,虽然代码精简了很多,但还是不可避免的有部分是重复的。 而我们真正需要实现的是,实现一次 我们在很早的时候已经说过C++的强制类型转换,这里,我们也能够通过常量性转移除来实现。
我们具体看下上面的实现。
首先将 最后再将转换后的对象的const属性去除。const_cast操作是会去除一个const 对象的const属性。 如果我们可以让 non-const对象调用 const成员函数,那么反过来呢?是不是也可以。 其实const函数承诺绝不会改变其对象的逻辑状态,但是non-const函数并没有,如果反过来调用,就会违背这项原则。 所以使用const成员函数调用non-const成员函数是错误的,因为对象可能被改变。
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 10:40:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |