题
对于某些C类:
C* a = new C();
C* b(a); //what does it do?
C* b = a; //is there a difference?
解决方案
C * b(a)和C * b = a是等价的。与许多语言一样,有多种方法可以做到这一点......
其他提示
请注意
C* a = new C();
C* b(a);
b是指向与a分配相同值的C对象的指针。但是,
#include "somefile.h"
C* b(a);
我们可以很容易地将b定义为一个接受a类型对象的函数,并返回一个指向C的指针。
该标准描述了不同类型的初始化是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
}
- C * a = new C();现在它正在创建一个指针
类型C,也分配新的
内存使用新关键字....
- 以下声明取决于 您的构造函数逻辑。 C* B(A); //它做了什么?
- 你的第一和第三个陈述是 当量。 C * b = a; //有没有 差? 醇>
第一个创建C的新实例并将其地址放在。
中第二个是指向函数的指针。该指针可以指向任何带有类型a的参数的函数,并返回指向类型为C的对象的指针。
第三个声明b,指向类型为C的对象的指针,并用。
初始化它不隶属于 StackOverflow