详解C++ 共享数据保护机制

  下面随笔说明C++共享数据保护机制。

共享数据的保护

  对于既需要共享、又需要防止改变的数据应该声明为常类型(用const进行修饰)。

  对于不改变对象状态的成员函数应该声明为常函数。

(1)常类型

  ①常对象:必须进行初始化,不能被更新。

  const 类名 对象名

  ②常成员

  用const进行修饰的类成员:常数据成员和常函数成员

  ③常引用:被引用的对象不能被更新。

  const  类型说明符  &引用名

  ④常数组:数组元素不能被更新(详见第6章)。

  类型说明符  const  数组名[大小]...

  ⑤常指针:指向常量的指针(详见第6章)。

(2)常对象

  用const修饰的对象

例:

class A

{

 public:

 A(int i,int j) {x=i; y=j;}

      ...

 private:

 int x,y;

};

A const a(3,4); //a是常对象,不能被更新

(3)常成员

  用const修饰的对象成员

  ①常成员函数

  使用const关键字说明的函数。

  常成员函数不更新对象的数据成员。

  常成员函数说明格式:

  类型说明符  函数名(参数表)const;

  这里,const是函数类型的一个组成部分,因此在实现部分也要带const关键字。

  const关键字可以被用于参与对重载函数的区分

  通过常对象只能调用它的常成员函数。

  ②常数据成员

  使用const说明的数据成员。

//常成员函数举例

#include<iostream>

using namespace std;

class R {

public:

 R(int r1, int r2) : r1(r1), r2(r2) { }

 void print();

 void print() const;

private:

 int r1, r2;

};

void R::print() {

 cout << r1 << ":" << r2 << endl;

}

void R::print() const {

 cout << r1 << ";" << r2 << endl;

}

int main() {

 R a(5,4);

 a.print(); //调用void print()

 const R b(20,52);

 b.print(); //调用void print() const

  return 0;

}
//常数据成员举例

#include <iostream>

using namespace std;

class A {

public:

  A(int i);

  void print();

private:

  const int a;

  static const int b; //静态常数据成员

};

const int A::b=10;

A::A(int i) : a(i) { }

void A::print() {

 cout << a << ":" << b <<endl;

}

int main() {

//建立对象a和b,并以100和0作为初值,分别调用构造函数,

//通过构造函数的初始化列表给对象的常数据成员赋初值

 A a1(100), a2(0);

 a1.print();

 a2.print();

 return 0;

}

(4)常引用

  如果在声明引用时用const修饰,被声明的引用就是常引用。

  常引用所引用的对象不能被更新。

  如果用常引用做形参,便不会意外地发生对实参的更改。常引用的声明形式如下:

  const  类型说明符  &引用名;

//常引用作形参

#include <iostream>

#include <cmath>

using namespace std;

class Point { //Point类定义

public:   //外部接口

  Point(int x = 0, int y = 0)

 : x(x), y(y) { }

  int getX() { return x; }

  int getY() { return y; }

  friend float dist(const Point &p1,const Point &p2);

private:   //私有数据成员

  int x, y;

};

float dist(const Point &p1, const Point &p2) {

  double x = p1.x - p2.x;

  double y = p1.y - p2.y;

  return static_cast<float>(sqrt(x*x+y*y));

}

int main() { //主函数

  const Point myp1(1, 1), myp2(4, 5);

  cout << "The distance is: ";

  cout << dist(myp1, myp2) << endl;

  return 0;

}

以上就是详解C++ 共享数据保护机制的详细内容,更多关于C++ 共享数据保护机制的资料请关注我们其它相关文章!

(0)

相关推荐

  • 解决易语言转换到C++ 自定义数据类型

    自定义数据类型如下 .版本 2 .数据类型 数据 .成员 坐标, 坐标_数据类型 .数据类型 坐标_数据类型 .成员 x, 小数型 .成员 z, 小数型 .成员 y, 小数型 这里的自定义数据类型下的"数据"类型下的"坐标"成员引用自定义数据类型"坐标_数据类型" 子程序如下 .版本 2 .子程序 自己数据 .参数 返回数据, 数据, 参考 返回数据.坐标.x = 1 返回数据.坐标.z = 2 返回数据.坐标.y = 3 这里的子程序内的参数&

  • C/C++读写注册表中二进制数据(代码示例)

    1.RegOpenKeyEx 函数: 原形: LONG RegOpenKeyEx(               HKEY hKey,     // 要打开主键名               LPCTSTR lpSubKey, // 需要打开的子键或路径               DWORD ulOptions,  // 保留,为0              REGSAM samDesired, // 操作权限标志               PHKEY phkResult  // 指向你打开键

  • C++实践数组作数据成员的参考

    [项目 - 数组作数据成员]下面是设计好的一个工资类(Salary): class Salary { public: void set_salarys( );//输入职工工资(输入-1标志着工资输入结束),工资保存到salary数组中,实际人数保存到number中: void add_salarys(int x); //给每个人涨x元工资 void sort_salarys(); //对工资由大到小排序 void show_salarys( ); //显示工资信息 private: double

  • 解决C++ fopen按行读取文件及所读取的数据问题

    1.已有文本文件: string dataList; 使用fopen读取: FILE *fpListFile = fopen(dataList.c_str(), "r"); if (!fpListFile){ cout << "0.can't open " << dataList << endl; return -1; } 2.按行读取数据: 方法一: char loadImgPath[1000]; while(EOF != fs

  • c++读取数据文件到数组的实例

    在刷题过程中,遇到的读取文件问题,只是记录自己的问题,新手~ 如果在一个txt文件当中有以下数据 1 2 3 4 5 6 7 8 9 10 1.如果我们只是简单将这些数据保存在一个数组中: #include <iostream> #include <fstream> using namespace std; int main() { int i,datalen=0; double num[100]; ifstream file("data.txt"); whil

  • Eclipse中C++连接mysql数据库

    本文为大家分享了Eclipse中C++连接mysql数据库的具体代码,供大家参考,具体内容如下 MinGW的配置在C连mysql里已经提到,这里只说C++跟C配置不同的地方. 首先觉得C++比C方便多了,不用生成.a连接文件,直接使用.lib文件即可 导入.h文件所在目录到C++ Compiler中的includes 添加lib文件搜索 代码: #include <winsock.h> #include <iostream> #include <string> #inc

  • C++数据结构之实现邻接表

    本文实例为大家分享了C++数据结构之实现邻接表的具体代码,供大家参考,具体内容如下 一.图的邻接表实现 1.实现了以顶点顺序表.边链表为存储结构的邻接表: 2.实现了图的创建(有向/无向/图/网).边的增删操作.深度优先递归/非递归遍历.广度优先遍历的算法: 3.采用顶点对象列表.边(弧)对象列表的方式,对图的创建进行初始化:引用 "ObjArrayList.h"头文件,头文件可参看之前博文"数据结构之顺序列表(支持对象元素)"代码: 4.深度优先遍历分别采用递归/

  • C++多线程编程时的数据保护

    在编写多线程程序时,多个线程同时访问某个共享资源,会导致同步的问题,这篇文章中我们将介绍 C++11 多线程编程中的数据保护. 数据丢失 让我们从一个简单的例子开始,请看如下代码: #include <iostream> #include <string> #include <thread> #include <vector> using std::thread; using std::vector; using std::cout; using std::

  • C++实现数据文件存储与加载

    本文实例为大家分享了C++实现数据文件存储与加载的具体代码,供大家参考,具体内容如下 首先请先确认已经安装好了opencv3及以上版本. #include <opencv2/opencv.hpp> #include <iostream> #include <string> using namespace cv; using namespace std; 存储 then int main() { //创造一些要存的数据先 string words = "hell

  • C++连接mysql数据库的两种方法小结

    现在正做一个接口,通过不同的连接字符串操作不同的数据库.要用到mysql数据库,以前没用过这个数据库,用access和sql server比较多.通过网上的一些资料和自己的摸索,大致清楚了C++连接mysql的方法.可以通过2种方法实现. 第一种方法是利用ADO连接, 第二种方法是利用mysql自己的api函数进行连接. 第一种方法可以实现我当前的需求,通过连接不同的字符串来连接不同的数据库.暂时只连接了mysql,sqlserver,oracle,access.对于access,因为它创建表的

随机推荐