聊一聊 C++的特性 explicit && 匿名空间

聊一聊 C++的特性 explicit && 匿名空间

explicit关键字

首先看一下explicit的做用:explicit 是避免构造函数的参数自动转换为类对象的标识符,平时代码中并非常常用到,可是,有时候就是由于这个,会形成必定的BUG出现,而咱们却苦苦查询不到问题;ios

下面看一个例子来讲明下:bash

案例一服务器

test.cpp微信

#include <iostream>

using namespace std;

class Test
{
public:
    Test(int a)
    {
        _num = a;
    }
    int getNum()
    {
        return _num;
    }
private:
    int _num;
};

int main()
{
    Test t = 'c';
    cout<<t.getNum()<<endl;
    return 0;
}
复制代码

咱们看下结果:函数

root@iZuf67on1pthsuih96udyfZ:~/C++/Net_C++/Lab_tt# g++ test.cpp -o test
root@iZuf67on1pthsuih96udyfZ:~/C++/Net_C++/Lab_tt# ./test 
99
复制代码

咱们会发现,程序在内部就自动帮咱们进行了转换,假设咱们原本是想获得是字符‘c’,可是被莫名的修改成了99,其实在一些程序中,咱们没有太关注这些自动转换的状态,可是咱们阅读一些开源代码库的时候,不少都会避免这类事情发生,而使用关键字explicit就是武器;学习

来看下构造函数使用explicit的效果:ui

案例二spa

#include <iostream>

using namespace std;

class Test
{
public:
    explicit Test(int a)
    {
        _num = a;
    }
    int getNum()
    {
        return _num;
    }
private:
    int _num;
};

int main()
{
    Test t = 'c';
    cout<<t.getNum()<<endl;
    return 0;
}
复制代码

咱们编译一下:scala

root@iZuf67on1pthsuih96udyfZ:~/C++/Net_C++/Lab_tt# g++ test.cpp -o test
test.cpp: In function ‘int main()’:
test.cpp:22:14: error: conversion from ‘char’ to non-scalar type ‘Test’ requested
     Test t = 'c';
复制代码

咱们会发现使用explicit关键字,避免了上面异常自动转换的结果发生;code

建议:咱们编写C++类的时候,若是能能把握住传参的类型问题,能够忽略这个关键字,不过通常建议 加上,这样,也能够增长代码的健壮性;

匿名命名空间

对于命名空间,相信你们都仍是蛮熟悉的,尤为是using namespace std这段,可谓是行云流水呀!这这个使用了std的命名空间;

抛砖引玉法:static

咱们能够看一下static,回顾一下: 用于修饰 class 的数据成员,即所谓“静态成员”。这种数据成员的生存期大于 class 的对象(实例/instance)。静态数据成员是每一个 class 有一份,普通数据成员是每一个 instance 有一份,所以也分别叫作 class variable 和 instance variable。static类成员不像普通的类数据成员,static类数据成员独立于一切类对象处在。static类数据成员是与类关联的,但不与该类定义的对象有任何关系。即static不会像普通类数据成员同样每个类对象都有一份,所有类对象是共享一个static类成员的。例如A类对象修改了static成员为1,那么B对象对应的static类对象成员的值也会是1。

匿名的空间是C++用于替代使用static定义做用域为本编译单元的全局函数或全局变量的一种新的替代方式,匿名空间与命名的命名空间同样能够嵌套。因为匿名命名空间没有命名空间的名字,因此也没法在其它的编译单元内经过extern声明该变量,因而该变量天然也只在本编译单元内可见

​ ------来源互联网

咱们看一下例子;

案例三

#include <iostream>

using namespace std;

namespace 
{
    int num = 10;
}

namespace test
{
    namespace 
    {
        int num = 20;
    }
    void Print()
    {
        cout<<"_________________________"<<endl;
        cout<<"test::Print"<<endl;
        cout<<"test:num:"<<test::num<<endl;
        cout<<"num:"<<::num<<endl;
    }
}

int main()
{
    cout<<"_________________________"<<endl;
    cout<<"test::main"<<endl;
    cout<<"test:num:"<<test::num<<endl;
    cout<<"num:"<<::num<<endl;
    test::Print();
    return 0;
}
复制代码

结果:

root@iZuf67on1pthsuih96udyfZ:~/C++/Net_C++/Lab_tt# ./test
_________________________
test::main
test:num:20
num:10
_________________________
test::Print
test:num:20
num:10
复制代码

相对于static来讲,使用匿名空间的好处是: 1.对于一组多个标识符函数只须要使用一个匿名空间来声明,不须要屡次输入static。

2.能够嵌套。这样能够在不一样命名空间中使用多个同名的标识符。

想了解学习更多C++后台服务器方面的知识,请关注: 微信公众号:====CPP后台服务器开发====

相关文章
相关标签/搜索