这真的开始让我感到困惑。我什么时候使用它们,什么时候不用?
例如,我在链接列表上读取.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中的任何值?
答案 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
表示:
除非声明为mutable
,否则您无法修改此类的任何变量。
当对象为const
时,您可以将其称为此方法。
尝试:
#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
。