C++ 类名称后面的括号是否会创建新实例? //在a.h中 #包括 #包括 向量数组; 甲级 { 公众: A(int n); 私人: 阵列m; }; //在a.cpp中 #包括“a.h” A::A(int n) { m=阵列(n,0.0); }
我想在A的构造函数中初始化m。在类名(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
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);
}