用C++声明一个对象没有创建它?

Nil*_*ils 1 c++ constructor default-constructor

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

Car myCar;
Run Code Online (Sandbox Code Playgroud)

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

在Java中,我可以使用与上面完全相同的语句轻松声明一个对象并在以后创建它.

Art*_*ger 11

好吧,你很困惑,在Java中,一切都是对象的引用(甚至你可以想到像指针一样),而不是对象本身.所以你可能会这样做:

Car* car = NULL;
Run Code Online (Sandbox Code Playgroud)

然后通过以下方式明确地调用c'tor:

car = new Car( params...);
Run Code Online (Sandbox Code Playgroud)

并且delete在完成使用汽车对象后不要忘记打电话.

delete car;
Run Code Online (Sandbox Code Playgroud)


ste*_*anv 7

要做你在Java中所做的事,你在C++中声明一个指针:

Car* myCar;
Run Code Online (Sandbox Code Playgroud)


Sum*_*uma 6

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

你为什么要那样做?也许有一些干净的方法如何在C++风格中实现它.

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

auto_ptr<Car> car;

car = new Car(xxx);
Run Code Online (Sandbox Code Playgroud)

或"旧路":

Car *car = NULL;

car = new Car(xxx);

delete car;
Run Code Online (Sandbox Code Playgroud)

要在向量中查找项目,通常使用以下代码:

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;
  }
Run Code Online (Sandbox Code Playgroud)

在许多情况下,你可能也不想拥有汽车矢量,而是指向汽车的指针.

  • @Nils你可能想要使用向量迭代器而不是索引到向量中:`for(std :: vector <Car> :: iterator iter = myVector.begin(); iter!= myVector.end(); ++ iter )`,它允许你使用`*iter`来引用当前对象.无论哪种方式,你都可以在循环中对应当前元素进行引用,"Car&cur = myVector [i];"或"Car&cur =*iter;" (2认同)