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

sun*_*eng 5 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Sin*_*all 6

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

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

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

    MyClass m = Array(n,0.0)Array通过调用Array带有3个参数的构造函数创建类的未命名变量,然后将该未命名变量复制到其中m,但很可能编译器会通过复制省略来优化它.但是,如果将其更改为MyClass m; m = Array(n,0.0),则将调用后跟赋值运算符的构造函数.