爱上c++的第十天:共用数据的保护(const)

简介: 最近事情还是比较多,我的心态也出现了一些小问题,目前也在积极的调整,想学的东西太多,但是又不是那么容易学,不可避免的产生了一些消极的态度,老师也是对我很好,帮助我调整状态,很快我也会慢慢的持续变好,我自己也相信自己。好了,开始我们今天的学习。

你的c++学习路上明灯


最近事情还是比较多,我的心态也出现了一些小问题,目前也在积极的调整,想学的东西太多,但是又不是那么容易学,不可避免的产生了一些消极的态度,老师也是对我很好,帮助我调整状态,很快我也会慢慢的持续变好,我自己也相信自己。好了,开始我们今天的学习。


其实c++我们到了这里其实学的已经差不多了,还差后面的STL标准库,但是理论都差不多已经全部学完了,我们现在主要做的就是找到一些细节的地方然后去了解学习。


今天就开始做一期const的专题。


c++虽然采取了不少有效的措施(如private保护,类的封装等等)以增加数据的安全性,但是有些数据却是共享的,例如实参与形参,变量的与其引用,数据及其指针等人们可以在不同的场合通过不同的途径访问同一个数据对象。有时一些无意间的操作可能会造成变量的改变。


既要使数据能在一定范围内共享,又要保证它不能被任意修改,这是就可以把有关的数据定义为常量。


一,常对象


直接在定义对象时加关键字const,指定对象为常对象,常对象必须要有初值。


在该对象的生命周期中,对象中所有数据成员的值都不能被修改。凡是希望保证数据成员不被改变的对象,可以声明为常对象。


1.如果一个对象被声明为常对象,则通过该对象只能调用它的常成员函数,而不能调用该对象的普通成员函数(除了由系统自动调用的隐式的构造函数和析构函数)。常成员函数时常对象唯一的对外接口。


这是为了防止普通成员函数会修改常对象中的数据,就算普通成员函数中没有改变数据的操作,编译系统仍然不给通过。因为编译是以一个源程序文件为单位的,但是程序不一定只有一个源程序文件,即,函数的定义和声明不在一个源程序文件,就会造成麻烦,索性就直接不允许了。


2.常成员函数可以访问常对象中的数据成员,但仍然不允许修改常对象中的数据成员的值。


以上两点就保证了,常对象中的数据成员不会被改变。


3,但是有时候也会想让常对象中的某个数据成员的值改变,可以对该数据成员声明为mutable。


把该数据成员声明为可变的数据成员。


二,常对象成员


可以将对象的成员声明为const,包括常数据成员和常成员函数


1.常数据成员


只能通过构造函数的参数初始化表对常数据成员进行初始化,任何其他函数都不能对常数据成员赋值。


2,常成员函数


类型名  函数名(参数列表)const{}


const要在后面


在声明和定义的时候都要加const,调用的时候不用。


如果将成员函数声明为常成员函数,则只能引用本类中的数据成员,而不能修改它们,且常成员函数不能调用另一个非const成员函数。


三,指向对象的常指针


这个前面学过很多次了,不讲。


四,指向常对象的指针变量


1.如果一个变量已被声明为常变量,只能用指向常变量的指针指向它,不能用一般的指针变量去指向它。


2.指向常变量的指针变量除了可以指向常变量外,还可以指向未被声明为const的变量。此时不能通过此指针变量改变该变量的值。


char  c1='a';
const char *p;
p=&c1;
*p='b';//错的
c1='b';//对的,没有通过p访问c1,c1不是常变量


指向常变量的指针常量可以指向一个非const变量。这是可以通过指针变量访问该变量,但不能改变该变量的值。如果不是通过指针变量访问,则变量的值是可以改变的。


**3.如果函数的形参是指向普通(非const)变量的指针变量,实参只能用指向普通变量的指针,而不能用指向const变量的指针,这样的话,就还是可以改变变量的值。

目录
相关文章
|
2月前
|
存储 C++
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
|
2月前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
37 2
|
2月前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
2月前
|
存储 数据挖掘 C语言
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】
|
2月前
|
存储 安全 数据处理
【C++】C++ 超市会员卡管理系统(面向对象)(源码+数据)【独一无二】
【C++】C++ 超市会员卡管理系统(面向对象)(源码+数据)【独一无二】
|
3月前
|
存储 C++ 容器
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
47 5
|
3月前
|
设计模式 监控 Go
开发与运维C++问题之C++部分原有的数据发送能力如何解决
开发与运维C++问题之C++部分原有的数据发送能力如何解决
23 1
|
3月前
|
存储 数据格式 运维
开发与运维C++问题之更改数据模型为通用数据结构如何解决
开发与运维C++问题之更改数据模型为通用数据结构如何解决
21 1
|
2月前
|
存储 算法 C++
【C/C++】C/C++ KTV点歌系统设计与实现(源码+数据+报告)【独一无二】
【C/C++】C/C++ KTV点歌系统设计与实现(源码+数据+报告)【独一无二】
|
3月前
|
安全 算法 编译器
C++一分钟之-内存模型与数据竞争
【7月更文挑战第10天】了解C++11内存模型对多线程编程至关重要。它定义了线程间同步规则,包括顺序一致性、原子操作和内存屏障。数据竞争可能导致不确定行为,如脏读和丢失更新。可通过互斥量、原子操作和无锁编程避免竞争。示例展示了`std::mutex`和`std::atomic`的使用。掌握内存模型规则,有效防止数据竞争,确保多线程安全和性能。
46 0
下一篇
无影云桌面