何时使用()类?

时间:2010-06-06 14:05:17

标签: c++ function linked-list

这真的开始让我感到困惑。我什么时候使用它们,什么时候不用?

例如,我在链接列表上读取.cpp,其类声明为:

struct CarPart
{
    long PartNumber;
    char Partname[40];
    double UnitPrice;

    CarPart *next;
};

class ListOfParts
{
    int size;

public:
    CarPart *head;

    ListOfParts();
    ~ListOfParts();

    const int count() const;
    void insert( CarPart *item );
    CarPart *retrieve( int pos );
};

使用此代码,为什么我可以写

ListOfParts *pPart = new ListOfParts();
CarPart *pCarPart = new CarPart;

声明ListOfParts的实例需要(),但不是我的CarPart?那令我困惑。当我之前问过一个问题时,人们告诉我这样的声明是一个返回ListOfParts对象的函数,而不是实际的构造函数。所以我猜这仍然是不同的。

这里发生了什么?

PS:我是否正确假设count()右边的const意味着我无法修改count中的任何值?

3 个答案:

答案 0 :(得分:9)

在堆上分配时,声明ListOfParts类的实例不需要()。两种形式都有效:

ListOfParts *pPart1 = new ListOfParts();
ListOfParts *pPart2 = new ListOfParts;

编辑: 正如评论者指出的那样,it makes a difference初始化POD type 时(但与您的代码示例无关)。

但是,在声明堆栈变量或静态变量时,这很重要,因为()的表单与声明函数相同。

ListOfParts pPart1(); // a function prototype
ListOfParts pPart2; // a object construction
const右侧的

count()表示您无法修改此函数中当前对象中的任何值,这将是this->size和{{1 (注意,您仍然可以通过this->head更改指向的对象。)

答案 1 :(得分:2)

在编写本文时,您可以使用带有和不带()的版本:

ListOfParts *pPart = new ListOfParts();

相当于:

ListOfParts *pPart = new ListOfParts;

从其他答案中无耻地复制:Excep POD

声明中的修饰符const表示:

  1. 除非声明为mutable,否则您无法修改此类的任何变量。

  2. 当对象为const时,您可以将其称为此方法。

  3. 尝试:

    #include <iostream>
    
    class test
    {
         void testf() {
              std::cout << "void test();" << std::endl;
         }
    
         void testf() const {
              std::cout << "void test() const;" << std::endl;
         }
     };
    
     int main() {
          test t;
          t.testf();
          const test &t2 = t;
          t2.testf();
     }
    

答案 2 :(得分:1)

至于您的帖子脚本:是的,这意味着当您在count()实例上调用ListOfParts时,您无法修改任何实例成员变量。除非他们被宣布为mutable