对于某些C类:
C* a = new C();
C* b(a); //what does it do?
C* b = a; //is there a difference?
答案 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)
答案 4 :(得分:-2)
第一个创建C的新实例并将其地址放在。
中第二个是指向函数的指针。该指针可以指向任何带有类型a的参数的函数,并返回指向类型为C的对象的指针。
第三个声明b,指向类型为C的对象的指针,并用。
初始化它