当前位置:   article > 正文

C++中::作用域运算符用法详解_c++作用域运算符

c++作用域运算符

使用::作用域运算符,可以让你的代码减少出错的概率。今天在读空间配置器接口时,看到了如下代码。

  1. template <class T>
  2. inline T* _allocate(ptrdiff_t size, T*){
  3. set_new_handler(0);
  4. T* tmp = (T*)(::opterator new(size_t)(size * sizeof(T)));
  5. if (tmp == 0){
  6. cerr << "out of memory" << endl;
  7. exit(1);
  8. }
  9. return tmp;
  10. }

此处,::operator new中::的作用是调用了全局的operator new()函数。::作用域运算符,主要有以下三个使用场景。

全局作用域符

像上述代码的形式一样,全局作用域运算符使用(::valName)的形式来调用全局函数或者全局变量。当我们在类或者函数外定义了同名函数或者变量。我们可以使用::来调用全局函数。下面的例子是在类中重载operator new函数,并在重载函数中调用全局的operator new函数。(注:new和delete操作我们是无法改变的,我们只能重载operator new函数)

  1. class allocator{
  2. pulic:
  3. allocator() {cout << "construct" << endl;}
  4. ~allocator() {cout << "destruct" << endl;}
  5. void* operator new(size_t size){
  6. printf("malloc size of %d \r\n", size);
  7. return ::operator new(size);
  8. }
  9. void operator delete(void *ptr){
  10. printf("free the memory");
  11. ::operator delete(ptr);
  12. }
  13. }

命名空间作用域符

可以使用(namespace::valName)的形式来声明调用哪一个命名空间的变量名,从而避免重名函数或者变量。

  1. //allocator.h
  2. namespace newAllocator{
  3. class allocator{
  4. /*
  5. * balabala
  6. */
  7. }
  8. }
  9. //allocator.cpp
  10. #include "allocator.h"
  11. #include <iostream>
  12. using namespace std;
  13. int main(){
  14. int a[5] = {0, 1, 2, 3, 4};
  15. vector<int, newAllocator::allocator> v(a, a+5);
  16. }

上述代码,我们使用了newAllocator::allocator来指明使用newAllocator命名空间下的allocator类。

类作用域符

在类中声明函数后,可以在类外使用域作用符来完成函数定义。使用形式为(class::funName)

  1. class allocator{
  2. public:
  3. void foo();
  4. }
  5. void allocator::foo(){
  6. cout << "this is foo" << endl;
  7. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/51482
推荐阅读
相关标签
  

闽ICP备14008679号