在C++ W/O中声明一个对象创建它?

在C++ W/O中声明一个对象创建它?,c++,constructor,default-constructor,C++,Constructor,Default Constructor,这可能吗?例如,如果我写 Car myCar; 然后调用不带Car参数的构造函数。如果只有构造函数接受参数,则会导致错误 在Java中,我可以很容易地声明一个对象,并在以后使用与上面完全相同的语句创建它。要执行Java中的操作,请在C++中声明一个指针: Car* myCar; 要执行Java中的操作,请在C++中声明一个指针: Car* myCar; 不,这是不可能的。你可以根据新的位置提出一些肮脏的黑客攻击,这可能会让你接近,但我怀疑你对它们感兴趣 你为什么要这么做?也许有一些干净的方

这可能吗?例如,如果我写

Car myCar;
然后调用不带Car参数的构造函数。如果只有构造函数接受参数,则会导致错误


在Java中,我可以很容易地声明一个对象,并在以后使用与上面完全相同的语句创建它。

要执行Java中的操作,请在C++中声明一个指针:

Car* myCar;

要执行Java中的操作,请在C++中声明一个指针:

Car* myCar;

不,这是不可能的。你可以根据新的位置提出一些肮脏的黑客攻击,这可能会让你接近,但我怀疑你对它们感兴趣

你为什么要这么做?也许有一些干净的方式如何实现这在C++风格。

如果只想创建一个变量,稍后将指向某个对象,这就是指针在C++中使用的指针。

auto_ptr<Car> car;

car = new Car(xxx);
要在向量中查找项,通常使用如下代码:

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;
  }

在许多情况下,您可能也不希望有一个汽车矢量,而是一个指向汽车的指针。

不,这是不可能的。你可以根据新的位置提出一些肮脏的黑客攻击,这可能会让你接近,但我怀疑你对它们感兴趣

你为什么要这么做?也许有一些干净的方式如何实现这在C++风格。

如果只想创建一个变量,稍后将指向某个对象,这就是指针在C++中使用的指针。

auto_ptr<Car> car;

car = new Car(xxx);
要在向量中查找项,通常使用如下代码:

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中,所有东西都是一个引用,甚至您可以像指针一样指向对象,而不是对象本身。 所以你可能会这样做:

Car* car = NULL;
然后通过以下方式显式调用c'tor:

car = new Car( params...);
不要忘记在使用完car对象后调用delete

delete car;

在Java中,所有东西都是引用,甚至可以像指针一样指向对象,而不是对象本身。 所以你可能会这样做:

Car* car = NULL;
然后通过以下方式显式调用c'tor:

car = new Car( params...);
不要忘记在使用完car对象后调用delete

delete car;

你也可以使用指针,例如

Car *myCar;
稍后你会写道:

myCar = new Car();

你也可以使用指针,例如

Car *myCar;
稍后你会写道:

myCar = new Car();

您在java中习惯的不是声明对象并在以后创建它,而是声明引用并在以后创建引用所引用的对象。在C++中,你要寻找的是:

Car *MyCar;
MyCar = new Mycar;

您在java中习惯的不是声明对象并在以后创建它,而是声明引用并在以后创建引用所引用的对象。在C++中,你要寻找的是:

Car *MyCar;
MyCar = new Mycar;

如讨论的,在C++中表示java对象的文字方式是使用指针指向类对象。

使用新语句的C++指针有缺点,必须访问较慢的堆,并且删除对象必须手动完成。 根据范围的不同,还有更多类似C/C++的解决方案

在全局或命名空间范围内,可以使用外部说明符声明在别处定义的对象:

extern C c;
<more code>
c(1,2,3);

外部关键字在C++中很少使用。

与往常一样,boost为库提供了一个优雅而通用的解决方案

这可以在任何地方使用,如下所示:

optional<int> oa; // declaration
<more code> 
*oa=3; // construction

如讨论的,在C++中表示java对象的文字方式是使用指针指向类对象。

使用新语句的C++指针有缺点,必须访问较慢的堆,并且删除对象必须手动完成。 根据范围的不同,还有更多类似C/C++的解决方案

在全局或命名空间范围内,可以使用外部说明符声明在别处定义的对象:

extern C c;
<more code>
c(1,2,3);

外部关键字在C++中很少使用。

与往常一样,boost为库提供了一个优雅而通用的解决方案

这可以在任何地方使用,如下所示:

optional<int> oa; // declaration
<more code> 
*oa=3; // construction

会不会有一个声明,比如extern Car myCar;做稍后您可以定义Car myCar,例如struct Car{Car{};外部车辆c;c车;int main{}可能重复的声明,如extern Car myCar;做稍后您可以定义Car myCar,例如struct Car{Car{};外部车辆c;c车;int main{}可能重复的井我必须从一个对象向量中找到一个对象,所以我不必一直使用myVector[I],我想先创建一个引用,然后在列表上创建一个循环,并将对象附加到循环之前创建的引用@Nils您可能希望使用向量迭代器而不是索引到向量中:forstd::vector::iterator iter=myVector.begin;iter!=myVector.end++iter,它允许您使用*iter引用当前对象。无论哪种方式,都可以在循环中创建一个与当前元素对应的引用

nt,Car&cur=myVector[i];或Car&cur=*iter;你为什么要写++iter而不是iter++?只是一个惯例,表明你不需要结果,并使编译器的工作更容易。你可以找到关于差异的多个主题,在这种特殊情况下,这并不重要。我必须从对象向量中找到一个对象,因此我不必一直使用myVector[I],我想先创建一个引用,然后在列表上创建循环,并将对象附加到循环之前创建的引用@Nils您可能希望使用向量迭代器而不是索引到向量中:forstd::vector::iterator iter=myVector.begin;iter!=myVector.end++iter,它允许您使用*iter引用当前对象。无论哪种方式,您都可以在循环中创建一个与当前元素对应的引用,Car&cur=myVector[i];或Car&cur=*iter;你为什么要写++iter而不是iter++?只是一个惯例,表明你不需要结果,并使编译器的工作更容易。你可以找到关于差异的多个主题,在这种特殊情况下,这并不重要。你可以在以后做另一辆车;myCar=&otherCar;另外,如果您想与java进行比较,对象位于堆上too@Nils,你别无选择。C++中的编写与java中的不一样。如果您不想调用C'tor,您必须在heap上实例化对象。。但是它需要一个空的构造函数来创建另一辆车。。也许最简单的方法就是添加一个..@Nils,不,你后来提到你想让它指向myVector[i]。所以只要做Car*myCar=&myVector[i];如果可以,也可以使用引用:Car&myCar=myVector[i];。您不必像@Artem Barger所说的那样在堆上实例化它,指向堆栈上元素的指针也可以。。。车*我的车;福林i=0。。如果myVector[i].label==3{myCar=myVector[i];},那么我就可以像在堆栈上创建的普通对象一样使用myCar了?不,你不能。你可以在以后做另一辆车;myCar=&otherCar;另外,如果您想与java进行比较,对象位于堆上too@Nils,你别无选择。C++中的编写与java中的不一样。如果您不想调用C'tor,您必须在heap上实例化对象。。但是它需要一个空的构造函数来创建另一辆车。。也许最简单的方法就是添加一个..@Nils,不,你后来提到你想让它指向myVector[i]。所以只要做Car*myCar=&myVector[i];如果可以,也可以使用引用:Car&myCar=myVector[i];。您不必像@Artem Barger所说的那样在堆上实例化它,指向堆栈上元素的指针也可以。。。车*我的车;福林i=0。。如果myVector[i].label==3{myCar=myVector[i];},那么我就可以像在堆栈上创建的普通对象一样使用myCar了?