C++中的 :: 用法(这篇让我感受到::的本质就是一个作用域符,清楚这个本质可以灵活使用,以后看代码,看到A::B,就直接当做B就可以了,前面的都可以忽略掉,这也也便于我们对代码的理解和阅读。)

这篇让我感受到::的本质就是一个作用域符,清楚这个本质可以灵活使用,而不是死记规则,双冒号前跟着什么就是什么的作用域,可能就这么简单。

就像理解了静态方法为什么可以直接通过类使用,这个规则就不用死记了。

 

以后看代码,看到A::B,就直接当做B就可以了,前面的都可以忽略掉,这也也便于我们对代码的理解和阅读。自己写代码的时候再考虑这个双冒号::,看代码就省去这些,不管你是什么作用域还是什么静态变量,静态成员函数,都可以省去前面那些东西,实质用的就是最后那一个,前面就当做一个名字或者路径。

 

所以可以有 A.B::C()  这种写法。

http://c.biancheng.net/view/vip_2234.html

 

拍自《C++ primer》147面

转载自:https://www.cnblogs.com/wujing-hubei/p/6102157.html

C++中的 :: 用法

::是运算符中等级最高的,它分为三种:
1)global scope(全局作用域符),用法(::name)
2)class scope(类作用域符),用法(class::name)
3)namespace scope(命名空间作用域符),用法(namespace::name)
他们都是左关联(left-associativity)
他们的作用都是为了更明确的调用你想要的变量,如在程序中的某一处你想调用全局变量a,那么就写成::a,如果想调用class A中的成员变量a,那么就写成A::a,另外一个如果想调用namespace std中的cout成员,你就写成std::cout(相当于using namespace
std;cout)意思是在这里我想用cout对象是命名空间std中的cout(即就是标准库里边的cout)

比如几天在看一个TCP的网络程序时,程序中自己定义了一个类封装了IP链接,而且名称也是用的connect,具体如下

复制代码

class IPStack 
{
public:    
    ........
    ........

    int connect(const char* hostname, int port)
    {
        int type = SOCK_STREAM;
        struct sockaddr_in address;
        int rc = -1;
        sa_family_t family = AF_INET;
        struct addrinfo *result = NULL;
        struct addrinfo hints = {0, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0, NULL, NULL, NULL};

        if ((rc = getaddrinfo(hostname, NULL, &hints, &result)) == 0)
        {
            struct addrinfo* res = result;

            /* prefer ip4 addresses */
            while (res)
            {
                if (res->ai_family == AF_INET)
                {
                    result = res;
                    break;
                }
                res = res->ai_next;
            }

            if (result->ai_family == AF_INET)
            {
                address.sin_port = htons(port);
                address.sin_family = family = AF_INET;
                address.sin_addr = ((struct sockaddr_in*)(result->ai_addr))->sin_addr;
            }
            else
                rc = -1;

            freeaddrinfo(result);
        }

        if (rc == 0)
        {
            mysock = socket(family, type, 0);
            if (mysock != -1)
            {
                int opt = 1;

                //if (setsockopt(mysock, SOL_SOCKET, SO_NOSIGPIPE, (void*)&opt, sizeof(opt)) != 0)
                //    printf("Could not set SO_NOSIGPIPE for socket %d", mysock);
                
                rc = ::connect(mysock, (struct sockaddr*)&address, sizeof(address));    //调用全局的connect函数即socket.h里面的connect函数
            }
        }

        return rc;
    }

复制代码

 

::的用法算是C++中的基础,如果运用的好的话,你程序的出错率也许会降很多
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值