C++公用数据的保护

简介: 1.有const修饰的成员,构造函只能以成员列表方式赋值,只能读取数据成员,不能改变数据成员;

1.有const修饰的成员,构造函只能以成员列表方式赋值,只能读取数据成员,不能改变数据成员;

//有const修饰的成员,构造函只能以成员列表方式赋值,只能读取数据成员,不能改变数据成员;
#include<iostream>
using namespace std;
class Time {
public:
  const int hour;
  const int minute;
  const int second;
  Time (int h,int m,int s):hour(h),minute(m),second(s){}
  //有const修饰的成员,构造函只能以成员列表方式赋值
  /*Time(int h,int m,int s) {
    hour = h;
    minute = m;
    second = s;
  }*/
  //错误,只能用成员列表的方式赋值
  void Show() {
    cout << hour << ":" << minute << ":" << second;
  }
};
int main()
{
  Time t(1, 2, 3);
  t.Show();
    //不能改变数据成员
  //t.hour = 10;//错误
  return 0;
}

59909e3994824b019a5e163dcc5d8c0b.png

2.在类的成员函数后面加 const,常函数,只能引用不能改变成员变量的值,可以被const对象调用。

//在类的成员函数后面加 const,常函数,只能引用不能改变成员变量的值,可以被const对象调用。
#include<iostream>
using namespace std;
class Time {
private:
  int hour;
  int minute;
  int second;
public:
  Time(int h, int m, int s) {
    hour = h;
    minute = m;
    second = s;
  }
  void fun()const {
    //只能引用
    cout << hour << ":" << minute << ":" << second << endl;
    //不能改变成员变量的值
    //minute = 0;//错误
  }
  void Show() {
    cout << hour << ":" << minute << ":" << second << endl;
  }
};
int main()
{
  const Time t(10,11,12);
  //可以被const对象调用
  t.fun();
  //不可以被非const对象调用
  //t.Show();//错误,该函数是非const函数,常对象只能调用const函数
  return 0;
}

e37abe06114346e780e39a5964a1e4ef.png


3.const修饰对象 叫常对象,只能调用const成员函数,无法调用非const成员函数。

//3.const修饰对象 叫常对象,只能调用const成员函数,无法调用非const成员函数。
#include<iostream>
using namespace std;
class Time {
private:
  int hour;
  int minute;
  int second;
public:
  Time(int h, int m, int s) {
    hour = h;
    minute = m;
    second = s;
  }
  void fun()const {
    cout << hour << ":" << minute << ":" << second << endl;
  }
  void Show() {
    cout << hour << ":" << minute << ":" << second << endl;
  }
};
int main()
{
  const Time t1(10,11,12);//常对象
  //常对象可以被const对象调用
  t1.fun();
  //常对象不可以被非const对象调用
  //t1.Show();//错误,该函数是非const函数,常对象只能调用const函数
  Time t2(20, 21, 22);//非常对象
  //非常对象可以被const对象调用
  t2.fun();
  //非常对象可以被非const对象调用
  t2.Show();
  return 0;
}

c0ba4b5fd9014cbbad9e0bec83908b78.png

PS:总结

image.png

4.mutable 修饰变量可以改变。

//4.mutable 修饰变量可以改变。
#include<iostream>
using namespace std;
class Time {
private:
  //定义mutable变量
  mutable int hour;
  int minute;
  int second;
public:
  Time(int h,int m,int s) {
    hour = h;
    minute = m;
    second = s;
  }
  void Show()const {
    //const函数中,mutable修饰的变量可以修改
    hour = 20;
    //const函数中,非mutable修饰的变量不可以修改
    //second = 6;//错误
    cout << hour << ":" << minute << ":" << second << endl;
  }
};
int main() {
  Time t(1,2,3);
  t.Show();
  return 0;
}

778298e6cd9042f6b5ab70a8c0c40d33.png



相关文章
|
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的强大功能,有助于编写简洁高效的代码。
40 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++标准库中提供数据容器作为数组的替代如何解决
50 5
|
3月前
|
设计模式 监控 Go
开发与运维C++问题之C++部分原有的数据发送能力如何解决
开发与运维C++问题之C++部分原有的数据发送能力如何解决
25 1
|
3月前
|
存储 数据格式 运维
开发与运维C++问题之更改数据模型为通用数据结构如何解决
开发与运维C++问题之更改数据模型为通用数据结构如何解决
26 1
|
2月前
|
存储 算法 C++
【C/C++】C/C++ KTV点歌系统设计与实现(源码+数据+报告)【独一无二】
【C/C++】C/C++ KTV点歌系统设计与实现(源码+数据+报告)【独一无二】
|
3月前
|
安全 算法 编译器
C++一分钟之-内存模型与数据竞争
【7月更文挑战第10天】了解C++11内存模型对多线程编程至关重要。它定义了线程间同步规则,包括顺序一致性、原子操作和内存屏障。数据竞争可能导致不确定行为,如脏读和丢失更新。可通过互斥量、原子操作和无锁编程避免竞争。示例展示了`std::mutex`和`std::atomic`的使用。掌握内存模型规则,有效防止数据竞争,确保多线程安全和性能。
49 0