首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下面两个C++类有什么不同?

下面两个C++类有什么不同?
EN

Stack Overflow用户
提问于 2015-05-06 03:12:53
回答 3查看 95关注 0票数 0
代码语言:javascript
复制
    //Version 1
    template <typename T>
    class Node<T> {
        private:
            T data;
            Node *next;
        public:
            Node(T data) {
                this->data = data;
                this->next = NULL;
            }
    };


    //Version 2
    template <typename T>
    class Node {
        private:
            T data;
            Node *next;
        public:
            Node(T);
    };
    template <typename T>
    Node<T>::Node(T val) {
        data = val;
        next = NULL;
    }

我搞不懂使用版本1创建类与使用版本2创建类有什么不同,版本1还是版本2是首选方法?

EN

回答 3

Stack Overflow用户

发布于 2015-05-06 03:29:27

首先,第二个根本不能编译。正确的语法是

代码语言:javascript
复制
template <typename T>
Node<T>::Node(T val) {  // note the <T> part

但除此之外,从编译器的角度来看,这是没有区别的。

然而,从程序员的角度来看,这是不同的。通过实现来污染类声明通常被认为是错误的。另一个想要使用你的代码的程序员(甚至是你自己,当你转移到项目的另一部分时)应该能够理解你的代码做了什么,而不需要查看实现,因此你不应该用实现细节来污染类声明。

更好的做法是将代码分离到一个单独的.cpp文件中,并将该.cpp文件#include到一个头文件中(后者是模板化类的必要条件,除非您使用显式实例化)。(有时会使用.cpp以外的扩展名,例如.tpp,用于此目的,但无论如何,文件都应该包含在头文件中。)

另一个注意事项是,您应该坚持使用构造函数中的成员初始化列表:

代码语言:javascript
复制
template <typename T>
Node::Node(T val): data(val), next(NULL) 
{}
票数 3
EN

Stack Overflow用户

发布于 2015-05-06 03:18:28

我会使用版本1,但没有显式的this指针和成员初始化器:

代码语言:javascript
复制
//Version 1'
template <typename T>
class Node {
    private:
        T data;
        Node *next;
    public:
        Node(T _data) : data(_data), next(0) { }
};

对于版本2,通常在实现文件中使用带有"::“的名称空间访问(.cc .cpp ...)而不是在标头afaik中

票数 0
EN

Stack Overflow用户

发布于 2015-05-06 03:59:22

在形式上,在第一个版本中构造函数是内联的,在第二个版本中则不是。然而,对于模板和现代优化编译器来说,这种差异是无关紧要的:因为它是一个模板,所以无论如何定义都必须在同一个文件中,优化器可能会忽略优化提示,因为它可以自己确定函数何时值得内联(对于这样一个简单的函数,它总是如此)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30061355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档