栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ Primer 5th笔记(chap 19 特殊工具与技术)两种不可移植的特性之“volatile”

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ Primer 5th笔记(chap 19 特殊工具与技术)两种不可移植的特性之“volatile”

1. volatile 限定符

当对象的值可能在程序的控制或检测之外被改变时, 应该将该对象声明为 volatile

volatile int display_register;  //display_register是一个int型的volatile对象 
volatile Task *curr_task;     //curr_task是一个指向volatile的Task类对象的指针
volatile int ixa[ max_size ];  //ixa是一个volatile的整型数组,数组的每个元素都被认为是volatile 的

//bitmap_buf是一个volatile的Screen类对象,它的每个数据成员都被视为volatile的
volatile Screen bitmap_buf;
  • const 和 volatile 限定符互相没什么影响, 某种类型可能既是volatile 的, 此时它同时具有二者的属性

1.1 volatile 限定符和指针之间的关系

volatile int v;  / / v 是一个 volatile int
int *volatile vip; / / vip 是一个 volatile 指针, 它指向 int
volatile int *ivp; / / ivp 是一个指针, 它指向一个 volatile int
// vivp 是一个 volatile 指针, 它指向一个 volatile int
volatile int *volatile vivp;

int *ip = &v; // 错误: 必须使用指向 volatile 的指针
ivp = &v; // 正确: ivp 是一个指向 volatile 的指针
vivp = &v;/ / 正确: vivp 是一个指向 volatile 的 volatile 指针

和 const 一样, 我们只能将一个 volatile 对象的地址( 或者拷贝一个指向volatile 类型的指针) 赋给一个指向 volatile 的指针。 同时, 只有当某个引用是volatile 的时, 我们才能使用一个 volatile 对象初始化该引用。

1.2 合成的拷贝对 volatile 对象无效

不能使用合成的拷贝/移动构造函数及赋值运算符初始化 volatile 对象或从 volatile 对象赋值。 合成的成员接受的形参类型是( 非 volatile ) 常量引用, 显然我们不能把一个非 volatile 引用绑定到一个 volatile 对象上,如果一个类希望拷贝、 移动或赋值它的 volatile 对象, 则该类必须自定义拷贝或移动操作

class Foo {
	public:
		Foo (const volatile Foo& ) ; //从一个 volatile 对象进行拷贝

		//将一个 volatile 对象賦值给一个非 volatile 对象
		Foo& operator= (volatile const Foo& );
		
		//将一个 volatile 对象賦值给一个 volatile 对象
		Foo& operator= (volatile const Foo& ) volatile;
		
		//Foo 类的剩余部分
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/347056.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号