C++中的const数据成员和cons成员函数

本文介绍了C++中const对象与非const对象的区别,以及如何使用const成员函数。通过示例展示了const对象只能调用const类型的成员函数,而非const对象则可以调用所有类型成员函数的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

////////////////////////////////////////////////////////////////////////////////////////
//
//  const对象只能调用const this函数。
//  非const 对象可以调用const this函数和非const this函数
//
//  void display() const : 编译器将该函数变形为: void display( const Type* this ) ;
//                                              ( const Type* 指向的对象是不能改变的 )
//
//  void display() : 编译器将该函数变形为: void display( Type* this ) ;
//
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////

#include <iostream>
using namespace std ;

class Test
{
public:
	Test() { }
	
	void display() { cout << "dislapy()" << endl ; }

	void display() const { cout << "display() const" << endl ; }
} ;

int main()
{
	Test t1 ;
	const Test t2 ;

	t1.display() ;
	t2.display() ;

	return 0 ;
}

### C++ 中 `std::queue` 的基本概念 在 C++ 标准库中,`std::queue` 是一种容器适配器,提供了先进先出 (FIFO) 数据结构的功能。该类模板定义于头文件 `<queue>` 中。 为了使用 `std::queue`,需要包含相应的头文件: ```cpp #include <queue> ``` ### 创建初始化队列 可以基于不同的底层容器来实例化 `std::queue`,默认情况下它使用的是 `std::deque` 容器作为内部存储机制[^1]。 ```cpp // 使用默认的 deque 底层实现 std::queue<int> intQueue; // 显式指定 list 作为底层容器 std::queue<std::string, std::list<std::string>> stringListQueue; ``` ### 基本操作方法 #### 添加元素至队尾 (`push`) 向队列末端添加新元素的方法是调用成员函数 `push()` 或者 `emplace()`. 后者允许直接构造对象而无需通过临时变量传递给参数列表. ```cpp intQueue.push(42); intQueue.emplace(84); // 对于内置类型效果相同;对于复杂类型可减少一次拷贝. ``` #### 移除队首元素(`pop`) 移除最前面的一个项目并释放其占用的空间可以通过 `pop()` 来完成;注意此动作不会返回被删除项的具体数值. ```cpp if (!intQueue.empty()) { intQueue.pop(); } ``` #### 访问队首/队尾元素(`front`, `back`) 获取但不移除当前位于队伍前端或者后端的对象可通过访问器 `front()` `back()` 获取对应位置上的值副本. ```cpp if (!intQueue.empty()) { auto frontValue = intQueue.front(); // 队伍开头处的数据 auto backValue = intQueue.back(); // 新加入的那个数 } ``` #### 询大小与状态 利用 `size()` 方法得知现存条目的总数目以及借助布尔表达式的 `empty()` 判断是否为空. ```cpp bool isEmpty = intQueue.empty(); size_t countElements = intQueue.size(); ``` ### 示例程序展示如何运用这些特性解决实际问题 下面给出一段简单的例子演示了怎样构建一个生产者消费者模型中的缓冲区角色: ```cpp #include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <queue> class SafeQueue { private: mutable std::mutex mut; std::condition_variable cond; std::queue<int> data_queue; public: void push(int value) { std::lock_guard<std::mutex> lock(mut); data_queue.push(value); cond.notify_one(); } bool empty() const { std::lock_guard<std::mutex> lock(mut); return data_queue.empty(); } int pop() { std::unique_lock<std::mutex> mlock(mut); while (data_queue.empty()) cond.wait(mlock); int val = data_queue.front(); data_queue.pop(); return val; } }; void producer(SafeQueue& q, int id) { for (int i = 0; ; ++i) { std::this_thread::sleep_for(std::chrono::milliseconds(id * 10)); q.push(i); std::cout << "Producer " << id << ": Produced item " << i << '\n'; } } void consumer(SafeQueue& q, int id) { while(true){ if(!q.empty()){ int value=q.pop(); std::cout<<"Consumer "<<id<<": Consumed item "<<value<<"\n"; std::this_thread::sleep_for(std::chrono::seconds(1)); }else{ std::this_thread::sleep_for(std::chrono::milliseconds(500)); } } } int main(){ SafeQueue safeQ; std::thread prod1(producer,std::ref(safeQ),1); std::thread cons1(consumer,std::ref(safeQ),1); prod1.join(); cons1.join(); return 0; } ``` 这段代码实现了多线程环境下的安全队列管理,其中包含了生产消费两个过程,并且加入了必要的同步控制措施以防止竞争条件的发生[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值