首页 > 其他 > 详细

volatile 和 explicit 的作用

时间:2016-02-06 01:46:04      阅读:139      评论:0      收藏:0      [点我收藏+]

volatile和explicit这两个C++关键字一般初学者不太有机会使用,因此不明白它们的作用。

1. volatile

volatile是修饰变量类型的,建立语言级别的memory barrier, BS(c++之父)的解释是

A volatile specifier is a hint to a compiler that an object may change its value in ways not specified by the language so thataggressive optimizations must be avoided.

直观上来说,volatile 是让编译器不对变量取值进行 优化的,很多时候当编译时,编译器认为变量值没有发生变化时就会简化掉取值的过程,但是有的时候存在其他编译器探测不到的情况会改变变量的值,例如汇编调用或者是多线程环境,多线程中的共享变量经常会发生改变,这个时候就需要每次从内存中读取数值。

使用方法:

1 int volatile value;
2 
3 //vptr1的指针是volatile, vptr2指向的值是volatile
4 int* volatile vptr1;
5 volatile int* vptr2;

可以看到 volatile 和 const 的用法很像,非 volatile 变量可以转化成 volatile 类型,逆向转换则不行。

 

 

2. explicit

explicit 关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能显式进行类型转换。有两点需要注意:

1. explicit 只用于类内部构造函数的声明上。

2. 修饰的构造函数只能有一个参数。

 1 #include<iostream>
 2 
 3 class foo{
 4     public:
 5         explicit foo(double r): R(r){
 6             std::cout << "foo(double r)" << std::endl;
 7         }
 8         explicit foo(int r): R(r){
 9             std::cout << "foo(int r)" << std::endl;
10         }
11         foo(const foo& obj): R(obj.R){
12             std::cout << "foo(const foo& obj)" << std::endl;
13         }
14         foo& operator=(const foo& obj){
15             std::cout << "operator=" << std::endl;
16             R = obj.R;
17             return *this;
18         }
19         ~foo(){
20             std::cout << "~foo()" << std::endl;
21         }
22     private:
23         double R;
24 };
25 
26 int
27 main(void){
28         //下面的语句都没有报错,但是如果给拷贝构造函数加上 explicit 的话,就都会报错
29     foo A = foo(1.23);
30     foo B = A;
31     foo C = foo(123);
32 
33         //下面的语句报错了
34         foo A = 1.23;
35         
36     return 1;
37 }        

 参考别人的博文:

http://www.cnblogs.com/this-543273659/archive/2011/08/02/2124596.html#3359435

http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777432.html

volatile 和 explicit 的作用

原文:http://www.cnblogs.com/daghlny/p/5183723.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!