object * foo(bar)有什么作用?

时间:2009-04-30 14:03:52

标签: c++ pointers

对于某些C类:

C* a = new C();

C* b(a);  //what does it do?

C* b = a;  //is there a difference?

5 个答案:

答案 0 :(得分:14)

C * b(a)和C * b = a是等价的。与许多语言一样,有多种方法可以做到这一点......

答案 1 :(得分:4)

请注意

C* a = new C();
C* b(a);  

b是指向与a分配相同值的C对象的指针。但是,

#include "somefile.h"
C* b(a);  

我们可以很容易地将b定义为一个接受a类型对象的函数,并返回一个指向C的指针。

答案 2 :(得分:3)

该标准描述了不同类型的初始化是8.5,而这两个具体在8.5 / 12下。

C* b(a);  //what does it do?

这称为直接初始化。如果'b'具有类类型,则编译器将使用'a'作为参数对C中的构造函数执行重载解析。对于指针类型,它只是用'a'初始化'b'。

C* b = a;  //is there a difference?

标准确实认为这些在某些情况下是不同的,上述语法称为复制初始化。对于直接初始化,因为'b'不是类类型,所以它用'a'的值初始化。如果'a'和'b'是相同的类类型,则使用直接初始化

其中'b'是类类型而'a'具有不同的类型(类或不具有),则规则略有不同(8.5 / 14-b1.b3)。所以对于以下代码:

C b = a;

首先,尝试将'a'转换为'C'类型,然后使用此临时对象初始化'b'。这很重要,因为您可能会出现直接初始化成功但复制初始化失败的情况:

class A {
public:
  operator int ();
};

class B {
public:
  B (int);
};

void foo ()
{
  A a;
  B b1 (a);  // Succeeds
  B b2 = a;  // Fails
}

答案 3 :(得分:-1)

  1. C * a = new C();现在它正在创建一个指针 类型C,也分配新的 内存使用新关键字....
  2. 以下声明取决于 您的构造函数逻辑。 C* B(A); //它做了什么?
  3. 你的第一和第三个陈述是 当量。 C * b = a; //有没有 差?

答案 4 :(得分:-2)

第一个创建C的新实例并将其地址放在。

第二个是指向函数的指针。该指针可以指向任何带有类型a的参数的函数,并返回指向类型为C的对象的指针。

第三个声明b,指向类型为C的对象的指针,并用。

初始化它