【发布时间】:2009-04-30 14:03:52
【问题描述】:
对于某些 C 类:
C* a = new C();
C* b(a); //what does it do?
C* b = a; //is there a difference?
【问题讨论】:
对于某些 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 中的构造函数执行重载解析。对于指针类型,它只是将 'b' 初始化为 'a'。
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。
第二个是指向函数的声明。该指针可以指向任何接受 a 类型参数的函数,并返回指向 C 类型对象的指针。
第三个声明b,一个指向C类型对象的指针,并用a初始化它。
【讨论】: