这可能吗?例如,如果我写
Car myCar;
然后调用不带 Car 参数的构造函数。如果只有构造函数接受参数,则会导致错误。
在 Java 中,我可以轻松地声明一个对象,并在以后使用与上面完全相同的语句创建它。
这可能吗?例如,如果我写
Car myCar;
然后调用不带 Car 参数的构造函数。如果只有构造函数接受参数,则会导致错误。
在 Java 中,我可以轻松地声明一个对象,并在以后使用与上面完全相同的语句创建它。
好吧,您感到困惑,在Java中,一切都是对象的引用(甚至您可以认为是指针),而不是对象本身。所以你可能会这样做:
Car* car = NULL;
然后通过以下方式显式调用 c'tor:
car = new Car( params...);
并且不要忘记delete
在你使用完汽车对象后打电话。
delete car;
要执行您在 Java 中所做的事情,您需要在 C++ 中声明一个指针:
Car* myCar;
不,这是不可能的。您可以根据新位置提出一些肮脏的技巧,这可能会让您接近,但我怀疑您对它们感兴趣。
你为什么要这样做?也许有一些干净的方法可以以 C++ 风格实现这一目标。
如果您只想创建一个稍后将指向某个对象的变量,这就是 C++ 中使用的指针。
auto_ptr<Car> car;
car = new Car(xxx);
或“旧方式”:
Car *car = NULL;
car = new Car(xxx);
delete car;
要在向量中查找项目,通常使用如下代码:
std::vector <Car> cars;
Car *find = NULL;
for(std::vector<Car>::iterator car = cars.begin(); car != cars.end(); ++car )
for (int i=0; i<cars.size(); i++)
if (Match(*car,xxx)
{
find=car;
break;
}
在许多情况下,您可能也不希望有汽车向量,但也有指向汽车的指针。
您在 java 中习惯的不是声明对象并稍后创建它,而是声明引用并创建引用稍后引用的对象。在 C++ 中,您正在寻找的是:
Car *MyCar;
MyCar = new Mycar;
您也可以使用指针,例如
Car *myCar;
稍后你会写:
myCar = new Car();
如前所述,在 C++ 中表示 java 对象的文字方式是使用指向类对象的指针。
在 new 语句中使用 C++ 指针有一个缺点,即必须访问较慢的堆,并且必须手动删除对象。
根据范围,有更多类似 C/C++ 的解决方案。
在全局或命名空间范围内,您可以使用 extern-specifier 声明一个对象,在别处定义:
extern C c;
<more code>
c(1,2,3);
(extern 关键字在 C++ 中很少使用)。
像往常一样,boost 通过库boost::optional提供了一个优雅而通用的解决方案。
这可以在任何地方使用,如下所示:
optional<int> oa; // declaration
<more code>
*oa=3; // construction