C++ 11 新特性(一)

看下面代码,回答问题: 变量x的数据类型是什么?

#include 
#include 

class A {
private:
    struct index {
        struct inner {
            int n;
        };

        inner *newInner() {
            return new inner;
        }
    };

public:
    index i;
};

int main() {
    A a;
    auto x = a.i.newInner();
    std::cout << typeid(x).name() << std::endl;
    return 0;
}

其实我也不知道,这要是在C99中是不会这么使用的,但是代码的确可以编译过去?引申问题,如果实用vector保存变量x的类型的数据集合?代码如下:

#include 
#include 

class A {
private:
    struct index {
        struct inner {
            int n;
        };

        inner *newInner() {
            return new inner;
        }
    };

public:
    index i;
};

int main() {
    auto x = a.i.newInner();
    x->n = 10;
    std::cout << typeid(x).name() << std::endl;

    std::vector vecInner;
    vecInner.push_back(a.i.newInner());
    vecInner.push_back(a.i.newInner());

    vecInner[0]->n = 10;
    vecInner[1]->n = 11;
    for (auto p : vecInner) {
        std::cout << p->n << std::endl;
    }
    return 0;
}

需要实用 decltype 关键字。

以上代码请参考:C++对象模型之RTTI的实现原理, C++11新特性之auto&decltype

这个问题有个根本性的问题,C++语言是如何实现private,protected和public?其实C++本质上都是一些指针,数据类型只是一种格式,如果从这点理解,我认为上面的代码是有效的,就个人而言,我是不赞成这么写代码的,这段代码的原型我从EOSIO中的智能合约部分看到的。

再多说两句,C++真的太复杂了,而且容易让人觉得自己到底是在学习语言,还是在学一门工具做业务。学C++还是需要多一点的耐性,而且还需要一点想象力,如果单纯说语言,我觉得可以学一门函数式语言,因为函数式编程的方式更通用点,需要什么就自己写一个语言,便于实现自己的业务,缺点就是,这玩意只能自己玩玩。

你可能感兴趣的:(C++ 11 新特性(一))