volatile 和 explicit 的作用
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 是让编译器不对变量取值进行 优化的,很多时候当编译时,编译器认为变量值没有发生变化时就会简化掉取值的过程,但是有的时候存在其他编译器探测不到的情况会改变变量的值,例如汇编调用或者是多线程环境,多线程中的共享变量经常会发生改变,这个时候就需要每次从内存中读取数值。
使用方法:
int volatile value; //vptr1的指针是volatile, vptr2指向的值是volatile int* volatile vptr1; 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