C++共享数据保护机制
下面随笔说明C++共享数据保护机制。
共享数据的保护
对于既需要共享、又需要防止改变的数据应该声明为常类型(用const进行修饰)。
对于不改变对象状态的成员函数应该声明为常函数。
(1)常类型
①常对象:必须进行初始化,不能被更新。
const 类名 对象名
②常成员
用const进行修饰的类成员:常数据成员和常函数成员
③常引用:被引用的对象不能被更新。
const 类型说明符 &引用名
④常数组:数组元素不能被更新(详见第6章)。
类型说明符 const 数组名[大小]...
⑤常指针:指向常量的指针(详见第6章)。
(2)常对象
用const修饰的对象
1 例:
2
3 class A
4
5 {
6
7 public:
8
9 A(int i,int j) {x=i; y=j;}
10
11 ...
12
13 private:
14
15 int x,y;
16
17 };
18
19 A const a(3,4); //a是常对象,不能被更新
(3)常成员
用const修饰的对象成员
①常成员函数
使用const关键字说明的函数。
常成员函数不更新对象的数据成员。
常成员函数说明格式:
类型说明符 函数名(参数表)const;
这里,const是函数类型的一个组成部分,因此在实现部分也要带const关键字。
const关键字可以被用于参与对重载函数的区分
通过常对象只能调用它的常成员函数。
②常数据成员
使用const说明的数据成员。
1 //常成员函数举例
2
3 #include<iostream>
4
5 using namespace std;
6
7 class R {
8
9 public:
10
11 R(int r1, int r2) : r1(r1), r2(r2) { }
12
13 void print();
14
15 void print() const;
16
17 private:
18
19 int r1, r2;
20
21 };
22
23
24
25 void R::print() {
26
27 cout << r1 << ":" << r2 << endl;
28
29 }
30
31 void R::print() const {
32
33 cout << r1 << ";" << r2 << endl;
34
35 }
36
37 int main() {
38
39 R a(5,4);
40
41 a.print(); //调用void print()
42
43 const R b(20,52);
44
45 b.print(); //调用void print() const
46
47 return 0;
48
49 }
1 //常数据成员举例
2
3 #include <iostream>
4
5 using namespace std;
6
7 class A {
8
9 public:
10
11 A(int i);
12
13 void print();
14
15 private:
16
17 const int a;
18
19 static const int b; //静态常数据成员
20
21 };
22
23
24
25 const int A::b=10;
26
27 A::A(int i) : a(i) { }
28
29 void A::print() {
30
31 cout << a << ":" << b <<endl;
32
33 }
34
35 int main() {
36
37 //建立对象a和b,并以100和0作为初值,分别调用构造函数,
38
39 //通过构造函数的初始化列表给对象的常数据成员赋初值
40
41 A a1(100), a2(0);
42
43 a1.print();
44
45 a2.print();
46
47 return 0;
48
49 }
(4)常引用
如果在声明引用时用const修饰,被声明的引用就是常引用。
常引用所引用的对象不能被更新。
如果用常引用做形参,便不会意外地发生对实参的更改。常引用的声明形式如下:
const 类型说明符 &引用名;
1 //常引用作形参
2
3 #include <iostream>
4
5 #include <cmath>
6
7 using namespace std;
8
9 class Point { //Point类定义
10
11 public: //外部接口
12
13 Point(int x = 0, int y = 0)
14
15 : x(x), y(y) { }
16
17 int getX() { return x; }
18
19 int getY() { return y; }
20
21 friend float dist(const Point &p1,const Point &p2);
22
23 private: //私有数据成员
24
25 int x, y;
26
27 };
28
29
30
31 float dist(const Point &p1, const Point &p2) {
32
33 double x = p1.x - p2.x;
34
35 double y = p1.y - p2.y;
36
37 return static_cast<float>(sqrt(x*x+y*y));
38
39 }
40
41
42
43 int main() { //主函数
44
45 const Point myp1(1, 1), myp2(4, 5);
46
47 cout << "The distance is: ";
48
49 cout << dist(myp1, myp2) << endl;
50
51 return 0;
52
53 }
C++共享数据保护机制的更多相关文章
- Android核心分析之二十五Android GDI之共享缓冲区机制
Androird GDI之共享缓冲区机制 1 native_handle_t对private_handle_t 的包裹 private_handle_t是gralloc.so使用的本地缓冲区 ...
- 2015级C++第7周项目 友元、共享数据保护、多文件结构
[项目1-成员函数.友元函数和一般函数有差别]參考解答 (1)阅读以下的程序,体会凝视中的说明(要执行程序,请找到课程主页并复制代码) //例:使用成员函数.友元函数和一般函数的差别 #include ...
- Fresco内存机制(Ashmem匿名共享内存)
Fresco的内存机制 Fresco是Facebook出品的高性能图片加载库,采用了Ashmem匿名共享内存机制, 来解决图片加载中的OOM问题.这里不对Fresco做深入分析,只关注Fresco在A ...
- Android应用程序组件Content Provider的共享数据更新通知机制分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6985171 在Android系统中,应用程序组 ...
- 0-Android使用Ashmem机制进行跨进程共享内存
Android使用Ashmem机制进行跨进程共享内存 来源: http://blog.csdn.net/luoshengyang/article/details/6651971 导语: 在Androi ...
- 基于OceanStor Dorado V3存储之数据保护 Hyper 特性
基于OceanStor Dorado V3存储之数据保护 Hyper 特性 1.1 快照 1.2 HyperCDP 1.3 HyperCopy 1.4 克隆(HyperClone) 1.5 ...
- C++11并发编程4------线程间共享数据
举个例子: 刚参加工作的你,只能租房住,嫌房租贵就和别人合租了,两个人住一起只有一个洗手间,每天早上起床的时候,如果你室友在洗手间,你就只能等着,如果你强行进去,那画面就不可描述了.同样的问题,如果多 ...
- Hadoop NameNode的ZKFC机制
博客原文:hackershell 之前在准备中级课程PPT,整理了下HA的基本内容,并且感谢松哥为我们提供了HA不会切的问题,以至于之后刚好出现的NameNode宕机,能够快速解决. NameNode ...
- mmap和shm共享内存的区别和联系
共享内存的创建 根据理论: 1. 共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制.共享内存可以通过mmap()映射普通文件(特殊情况下还可以采用匿 ...
随机推荐
- Grakn Forces 2020
比赛链接:https://codeforces.com/contest/1408 A. Circle Coloring 题意 给出三个长为 $n$ 的序列 $a,b,c$,对于每个 $i$,$a_i ...
- hdu5886Tower Defence(树形dp)
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- Codeforces Round #555 (Div. 3) C2. Increasing Subsequence (hard version) (贪心)
题意:给你一组数,每次可以选队首或队尾的数放入栈中,栈中元素必须保持严格单增,问栈中最多能有多少元素,并输出选择情况. 题解:首先考虑队首和队尾元素不相等的情况,如果两个数都大于栈顶元素,那么我们选小 ...
- python中is,== 和 in 的区别
python对象的三个基本要素:id(身份标识),type(数据类型)和value(值). is 运算符:判断的是对象间的唯一身份标识(id). == 运算符:判断的是对象间的value(值)是否相同 ...
- MIT 6.S081 聊聊xv6的文件系统(中)日志层与事务
前言 我本想把上篇中没讲完的剩余层全部在本篇中讲完,但没想到越写越多.日志层的代码不多,其思想和解决问题的手段也不算难以理解,但其背后涉及的原理和思想还是非常值得回味的,因此我打算用一整篇完整的blo ...
- NLNet-Theme for cnblogs
这篇文档仅作为markdown在cnblogs中的渲染效果展示.第一部分NLNet' Samples为自定义内容的效果展示.NOTE 第二.三部分的Markdown Reference(From Ty ...
- [Golang]-7 定时器和打点器
目录 定时器 打点器 After()方法 我们常常需要在未来某个时刻运行 Go 代码,或者在某段时间间隔内重复运行. Go 的内置 定时器 和 打点器 特性让这些很容易实现. 定时器 type Tim ...
- oslab oranges 一个操作系统的实现 实验五 让操作系统走进保护模式
实验目的: • 如何从软盘读取并加载一个Loader程序到操作 系统,然后转交系统控制权 • 对应章节:第四章 实验内容: 1. 向软盘镜像文件写入一个你指定的文件,手 工读取在磁盘中的信息 2. 在 ...
- DNS域名解析10步
第一步:浏览器缓存中检查有没有对应这个域名的解析过的IP地址,如有,结束 第二步:如浏览器缓存没有查到,则访问本地操作系统,window下通过C:\Windows\System32\drivers\e ...
- Java中输出小数点后几位
笔试时候,遇到让你写输出小数点后几位,当时很是头疼,下来后,查了查发现,没什么难的.网上有各种情况都讨论了(一般分为4种),在这里我着重讨论一下比较实用,比较简单,比较方便操作的几种: 1 publi ...