下面随笔说明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++共享数据保护机制的更多相关文章

  1. Android核心分析之二十五Android GDI之共享缓冲区机制

    Androird GDI之共享缓冲区机制 1  native_handle_t对private_handle_t 的包裹     private_handle_t是gralloc.so使用的本地缓冲区 ...

  2. 2015级C++第7周项目 友元、共享数据保护、多文件结构

    [项目1-成员函数.友元函数和一般函数有差别]參考解答 (1)阅读以下的程序,体会凝视中的说明(要执行程序,请找到课程主页并复制代码) //例:使用成员函数.友元函数和一般函数的差别 #include ...

  3. Fresco内存机制(Ashmem匿名共享内存)

    Fresco的内存机制 Fresco是Facebook出品的高性能图片加载库,采用了Ashmem匿名共享内存机制, 来解决图片加载中的OOM问题.这里不对Fresco做深入分析,只关注Fresco在A ...

  4. Android应用程序组件Content Provider的共享数据更新通知机制分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6985171 在Android系统中,应用程序组 ...

  5. 0-Android使用Ashmem机制进行跨进程共享内存

    Android使用Ashmem机制进行跨进程共享内存 来源: http://blog.csdn.net/luoshengyang/article/details/6651971 导语: 在Androi ...

  6. 基于OceanStor Dorado V3存储之数据保护 Hyper 特性

    基于OceanStor Dorado V3存储之数据保护 Hyper 特性 1.1  快照 1.2  HyperCDP 1.3  HyperCopy 1.4  克隆(HyperClone) 1.5   ...

  7. C++11并发编程4------线程间共享数据

    举个例子: 刚参加工作的你,只能租房住,嫌房租贵就和别人合租了,两个人住一起只有一个洗手间,每天早上起床的时候,如果你室友在洗手间,你就只能等着,如果你强行进去,那画面就不可描述了.同样的问题,如果多 ...

  8. Hadoop NameNode的ZKFC机制

    博客原文:hackershell 之前在准备中级课程PPT,整理了下HA的基本内容,并且感谢松哥为我们提供了HA不会切的问题,以至于之后刚好出现的NameNode宕机,能够快速解决. NameNode ...

  9. mmap和shm共享内存的区别和联系

    共享内存的创建 根据理论: 1. 共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制.共享内存可以通过mmap()映射普通文件(特殊情况下还可以采用匿 ...

随机推荐

  1. P3381 [模板] 最小费用最大流

    EK  + dijkstra (2246ms) 开氧气(586ms) dijkstra的势 可以处理负权 https://www.luogu.org/blog/28007/solution-p3381 ...

  2. zoj3593One Person Game (扩展欧几里德)

    There is an interesting and simple one person game. Suppose there is a number axis under your feet. ...

  3. Codeforces Round #649 (Div. 2)

    Codeforces Round #649 (Div. 2) -- WKL \(\mathcal{A}\)题: \(\mathrm{XXXXX}\) Greedy implementation *12 ...

  4. CodeCraft-20 (Div. 2) B. String Modification (字符串,规律)

    题意:有一个长度为\(n\)的字符串,你可以选取一个值\(k(1\le k \le n)\),然后遍历字符串,每次将区间长度为\(k\)的字符串反转,求反转后字典序最小的字符串,并输出\(k\)的值. ...

  5. 在WLS2下开发和部署NET Core3.1目录

    前言 在youtube推送上看到WSL2的消息(https://www.youtube.com/watch?v=MrZolfGm8Zk&t=1s),觉得很棒.恰好最近在学习PowerShell ...

  6. Python_小程序(云开发)

    一.云开发API初始化 wx.cloud.init({ env:'test-x1dzi', //环境ID traceUser:true //是否在控制台查看用户信息 }) 二.云开发API初始化-服务 ...

  7. K8S(04)核心插件-coredns服务

    K8S核心插件-coredns服务 目录 K8S核心插件-coredns服务 1 coredns用途 1.1 为什么需要服务发现 2 coredns的部署 2.1 获取coredns的docker镜像 ...

  8. JVM学习路线

    JVM探究 请你谈谈你对JVM的理解? java8虚拟机和之前的变化更新? 什么是OOM,什么是栈溢出StackOverFlowError?怎么分析? JVM的常用调优参数有哪些? 内存快照如何抓取, ...

  9. MongoDB 101

    MongoDB 101 Studio 3T https://studio3t.com/academy/ https://studio3t.com/academy/lessons/introducing ...

  10. empty Checker

    empty Checker "use strict"; /** * * @author xgqfrms * @license MIT * @copyright xgqfrms * ...