2

假设我有一个class A并且有声明:

一个 a1(1);

一个a2;a2(1);

这两种说法有什么区别?
我知道第一个陈述很简单,但是陈述 2 旁边发生了什么?

4

3 回答 3

5
A a1(1);

这通过使用参数调用构造函数来创建a1类的实例。A1

A a2; a2(1);

这实际上是两个陈述。第一个,通过调用的默认构造函数A a2;创建一个a2类的实例。第二个,然后使用参数调用(或在未定义的情况下产生错误)。AAa2(1);A::operator()1Aoperator()

于 2013-10-23T07:01:14.907 回答
4

不同之处在于,对于大多数类型,第二个不会编译。

第一个声明一个变量并用 value 初始化它1。从这样的值初始化称为直接初始化

第二个声明一个变量并默认初始化它;然后它会尝试像函数一样调用它,只有当它具有合适的重载时才有效operator()。在这种情况下,它会执行定义该运算符的任何操作。

也许你的意思是:

A a2; a2 = 1;

默认初始化变量,然后赋值 1。对于普通类型,这将与第一个具有相同的效果。对于定义构造函数和赋值运算符的类型,这将取决于它们是如何定义的。

于 2013-10-23T07:03:33.743 回答
0

构造函数是在创建对象期间调用的特殊函数。因此,根据您的代码,第一条语句会编译,因为它有一个匹配的构造函数。但是第二条语句不会创建任何实例,因为您已经为它提供了实现。

*class Shape
{
private:
    int cm;
public:
//    Shape()
//    {
//    }
//    Shape(int m_cm)
//    {
//        cm=m_cm;
//    }
};*

上面的代码可以创建一个实例,但它不能像 s(7) 一样初始化值。

于 2013-10-23T07:10:58.037 回答