C++ 类名称后面的括号是否会创建新实例? //在a.h中 #包括 #包括 向量数组; 甲级 { 公众: A(int n); 私人: 阵列m; }; //在a.cpp中 #包括“a.h” A::A(int n) { m=阵列(n,0.0); }

C++ 类名称后面的括号是否会创建新实例? //在a.h中 #包括 #包括 向量数组; 甲级 { 公众: A(int n); 私人: 阵列m; }; //在a.cpp中 #包括“a.h” A::A(int n) { m=阵列(n,0.0); },c++,constructor,C++,Constructor,我想在A的构造函数中初始化m。在类名(std::vector)后面直接加上一些参数的括号表达式合法吗 两者的区别是什么 数组m(n,0.0) 及 m=数组(n,0.0) 是的,这是合法的ClassName()调用该类的构造函数 注释:技术上,构造函数没有名称,因此在名称查找期间找不到它,因此类名称()/Cuffe >实际上是一个显式类型转换,使用函数符号表示,结果调用了构造函数(按C++标准12 .1.2)。 Array m(n,0.0)通过调用接受3个参数的Array构造函数,创建类Array

我想在A的构造函数中初始化m。在类名(
std::vector
)后面直接加上一些参数的括号表达式合法吗

两者的区别是什么
数组m(n,0.0)
m=数组(n,0.0)

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

    注释:技术上,构造函数没有名称,因此在名称查找期间找不到它,因此<代码>类名称()/Cuffe >实际上是一个显式类型转换,使用函数符号表示,结果调用了构造函数(按C++标准12 .1.2)。

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

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


  • 请注意,执行此操作的首选方法是使用初始值设定项列表:
    A::A(int n):m(n,0.0){}
    这将直接调用m成员的构造函数,而无需任何复制或开销。看,这是一个新的C++标准吗?@布莱克,不,它不是。@ TartanLlama,我不想使答案过于复杂,但我把它作为注释添加了。至于复制省略,我测试了它,它确实省略了,但是为了避免误解,我对答案做了一些编辑
    // 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);
    }