【问题标题】:Classes in C++ with Ctor [duplicate]带有 Ctor 的 C++ 中的类 [重复]
【发布时间】:2012-01-04 04:26:33
【问题描述】:

可能重复:
The Definitive C++ Book Guide and List

我有很多关于声明和实现的问题,根据大多数(书籍、教程、博客条目)的构造函数、方法和成员函数的类声明:

class Book
{
public:
    Book(const string & author_,
         const string & title_,
         const string & publisher_,
         double price_,
         double weight_);
    string getName()
    {
        string name;
        name = author + ": " + title;
        return name.substr(0, 40);
    }
    double getPrice();
    double getWeight();
private:
    string author, title, publisher;
    double price, weight;
};

我了解所有的访问级别、构造函数、引用运算符(也是指针!)、指针运算符,但是当我读到一些不那么琐碎的东西时:

class Type
{
public:
    enum TypeT {stringT, intT, doubleT, unknownT};

    // 1. which means "explicit"?
    // 2. what's ": typeId(typeId_)"? after the Ctor declaration
    explicit Type(TypeT typeId_) : typeId(typeId_) {}

    // 3. "const" after the declaration which means?
    BaseValue * newValue() const
    {
        return prototypes[typeId]->clone();
    }

    TypeT getType() const
    {
        return typeId;
    }

    static void init();
    {
        prototypes[stringT] = new Value<string>("");
        prototypes[intT] = new Value<int>(0);
        prototypes[doubleT] = new Value<double>(0);
    }

private:
    TypeT typeId;

    static vector<BaseValue *> prototypes;
};

我感到迷茫,真的没有找到关于上述几点的明确信息。

除了回答我的问题,如果你知道他们在哪里有这些语言“技巧”

【问题讨论】:

  • 并不是真正的重复,因为他提出了三个具体问题,尽管我同意他应该参考另一个问题,以作为开始阅读 C++ 书籍的好地方。

标签: c++


【解决方案1】:

一本好的 C++ 入门书应该可以回答您的问题。

  1. explicit 表示必须在代码中明确提及构造函数,不能在需要时从其他类型自动构造。
  2. 成员初始化。类成员不是使用其默认构造函数构造的,而是使用此处给出的参数构造的。
  3. 可以在const 对象上调用该方法。

【讨论】:

    【解决方案2】:

    1) 默认情况下,c++ 将假定任何采用另一种类型的参数的构造函数都可以用作从 arg 类型到构造函数类型的“隐式转换”;在您的示例中,这将允许您将 TypeT 传递给任何需要 Type 的函数,并且构造函数会假定您希望它在实际调用函数之前运行 Type(TypeT) 构造函数。

    explicit 关键字可以防止这种情况发生;它告诉编译器您只希望该构造函数在您专门调用它时运行。

    2) 在构造函数的原型和它的主体之间,你可以(并且,在大多数情况下,应该)提供一个初始化列表;运行构造函数时,系统会在运行构造函数主体之前初始化每个父级,然后是每个包含的成员。初始化列表告诉编译器你想在给定成员变量上运行哪个构造函数;在您的示例中,您正在 typeId 上运行复制构造函数。

    如果您没有在给定成员的初始值设定项列表中提供条目,系统将在进入原始类的主体之前简单地在该成员上运行默认构造函数。这意味着,如果您在类构造函数的主体中分配给该成员,您将两次写入该成员的内存。有时这是必要的,但在许多情况下简直是浪费。

    3) 方法原型末尾的const 向编译器保证该方法在调用时不会修改类实例中的任何成员变量。这允许在您的类的 const 实例上调用该方法,并且就像将 const 放在任何将保持不变的变量上一样,应尽可能保证正确性和类型安全。


    至于要阅读哪些书,您问题的 cmets 中的链接将是一个不错的起点。由于您似乎了解该语言的基本基础知识,因此我建议您从“Effective C++”开始。它列出了 C++ 的最佳实践,面向了解 C 语言方面的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 2013-11-24
      • 2015-10-13
      • 2014-05-21
      相关资源
      最近更新 更多