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()映射普通文件(特殊情况下还可以采用匿 ...
随机推荐
- tesseract-ocr的安装及使用pycharm来运行
1.可以在:http://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-4.00.00dev.exe 下载一个exe文件,然后直接按照提 ...
- Is It A Tree? POJ - 1308
题意: 题目给你一组单向边,当遇到输入0 0就证明这是一组边,当遇到-1 -1就要停止程序.让你判断这是不是一棵树 题解: 题目很简单,但是程序要考虑的很多 1.因为是一颗树,所以肯定不能出现环,这个 ...
- C# TCP应用编程三 异步TCP应用编程
利用TcpListener和TcpClient类在同步方式下接收.发送数据以及监听客户端连接时,在操作没有完成之前一直处于阻塞状态,这对于接受.发送数据量不大的情况或者操作勇士较短的情况下是比较方便的 ...
- Git 初始化及仓库创建及操作
一.基本信息设置 1.初始化设置用户名 2.初始化设置用户名邮箱 备注:该设置在Github仓库主页显示谁提交了该文件. 二.初始化一个新的Git仓库 1.创建文件夹 mkdir test 2.在文件 ...
- 如何创建一个GETH节点(单节点,windows环境)
所有命令都是在powershell上执行的 1.创建"创世块" 初始化配置 创建一个 hdgenesis.json文件,拷贝到geth根目录 { "config&q ...
- codeforces 1000C - Covered Points Count 【差分】
题目:戳这里 题意:给出n个线段,问被1~n个线段覆盖的点分别有多少. 解题思路: 这题很容易想到排序后维护每个端点被覆盖的线段数,关键是端点值不好处理.比较好的做法是用差分的思想,把闭区间的线段改为 ...
- hlt instruction with IF=0
mov AH, 2DH ;写时间. mov DH, 0 ;此时为0秒. int 21H ;写入系统. 遇到了这个问题. 原因是以及在保护模式了.保护模式下中断机制发生了很大的变化,原来的中断向量表被I ...
- PAT l2-010 排座位 【并查集】
L2-010. 排座位 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位. ...
- hdu 4465 Candy (非原创)
LazyChild is a lazy child who likes candy very much. Despite being very young, he has two large cand ...
- Get your site working on Google Search Console , 在 Google Search Console中运行您的网站, Google Search Console
1 1 https://support.google.com/webmasters/topic/4564315? Search Console Help SEARCH CONSOLEHELP FORU ...