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

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

template <class T>
inline T* _allocate(ptrdiff_t size, T*){
    set_new_handler(0);
    T* tmp = (T*)(::opterator new(size_t)(size * sizeof(T)));
    if (tmp == 0){
        cerr << "out of memory" << endl;
        exit(1);
    }
    return tmp;
}

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

全局作用域符

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

class allocator{
pulic:
    allocator() {cout << "construct" << endl;}
    ~allocator() {cout << "destruct" << endl;}
    void* operator new(size_t size){
        printf("malloc size of %d \r\n", size);
        return ::operator new(size);
    }
    void operator delete(void *ptr){
        printf("free the memory");
        ::operator delete(ptr);
    }
}

命名空间作用域符

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

//allocator.h

namespace newAllocator{
    class allocator{
        /*
        * balabala
        */
    }
}

//allocator.cpp

#include "allocator.h"
#include <iostream>
using namespace std;

int main(){
    int a[5] = {0, 1, 2, 3, 4};
    vector<int, newAllocator::allocator> v(a, a+5);
}

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

类作用域符

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

class allocator{
public:
    void foo();
}

void allocator::foo(){
    cout << "this is foo" << endl;
}

 

  • 4
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值