直接在类名后面括号是否创建了一个新实例?

时间:2015-09-23 13:52:04

标签: c++ constructor

// in a.h
#include <iostream>
#include <vector>

typedef std::vector<double> Array;
class A
{
    public:
          A(int n);
    private:
          Array m;
};

//in a.cpp
#include "a.h"
A::A(int n)
{
    m = Array(n, 0.0);
}

我想在A的构造函数中初始化m。括号的表达式是否在类名(std::vector<double>)之后直接带有一些参数?

之间的区别是什么      Array m(n,0.0)      和      m=Array(n,0.0)

1 个答案:

答案 0 :(得分:5)

  1. 是的,这是合法的。 ClassName()调用该类的构造函数。

    注意:从技术上讲,构造函数没有名称,因此在名称查找期间找不到它,因此ClassName()实际上是使用_results in_的函数表示法的显式类型转换调用构造函数(根据c ++标准12.1.2)。

  2. Array m(n,0.0)通过调用m的接受3个参数的构造函数来创建类Array的变量Array

    MyClass m = Array(n,0.0)通过使用3个参数调用Array的构造函数创建类Array的未命名变量,然后将该未命名变量复制到m,但很可能由于copy elision,编译器将对其进行优化。但是,如果将其更改为MyClass m; m = Array(n,0.0),则将调用后跟赋值运算符的构造函数。