它会分配新空间,还是只使用现有空间?那么第一个对象分配是否更加资源密集?像这样:
struct F {
int a,b,c,d;
F(int _a,int _b) {a = _a; b = _b};
void a(int _a,int _b) {a = _a; b = _b};
};
//first constructor call
F f = F(5,6);
//second constructor call on an already constructed object
f = F(7,8);
//third constructor call on an already constructed object
f(7,8);
//is the constructor call more res. intesive,than the call to a function which does the same?
f.a(9,0)
构造函数是否调用了更多的资源,而不是对函数调用(void a(…))?
当我在已经创建的对象上调用构造函数时,是否会调用析构函数?
解决方法
其次,构造函数定义是错误的.构造函数必须与类本身具有完全相同的名称.所以f()应该是F().是的,区分大小写在C中很重要!我假设这是你对其余代码片段的意思. OP只是打错了.
在我解释代码的其余部分之前,您必须了解C中的所有类(和结构)都有special member functions,如果您不提供它们,则由编译器自动生成.也就是说,您的代码段基本上与以下内容相同:
struct F
{
F(int _a,int _b) {a = _a; b = _b}; // constructor
~F() {} // destructor
F(const F& rhs) // copy constructor
: a(rhs.a),b(rhs.b),c(rhs.c),d(rhs.d)
{}
F& operator=(const F& a) // copy assignment operator
{
a = rhs.a;
b = rhs.b;
c = rhs.c;
d = rhs.d;
return *this;
}
void a(int _a,int _b) {a = _a; b = _b}; // one of your functions
int a;
int b;
int c;
int d;
};
如果未定义复制构造函数,复制赋值运算符或析构函数,编译器将为您生成它们.此外,如果您不提供其他构造函数,编译器将生成默认构造函数. F类没有默认构造函数,因为已经有一个(非复制)构造函数接受两个参数.
复制构造函数和复制赋值运算符的默认实现只是复制每个数据成员.
特殊成员函数存在的原因是因为C概括了将基元类型复制到用户定义对象的概念.考虑一下:
int a = 42; int b = 13; b = a;
对于像int这样的原始类型,你可以像这样复制它的值. C将复制语义概括为对象,以便您可以这样做:
F f(10,20); // calls first constructor F g(30,40); // calls first constructor g = f; // calls g's copy-assignment operator.
现在您可以看到这对您的代码有何影响:
F f = F(5,6);
上面的行构造一个临时F对象,然后通过复制构造函数将临时副本复制到f中.然后破坏临时F对象.
f = F(7,8);
上面的行构造另一个临时F对象,然后通过复制赋值运算符将临时值分配给f.然后破坏临时F对象.原始f对象未被破坏.
f.a(9,0)
上面的行是对名为f的对象的正常函数调用.
对于你的代码片段,假设编译器没有优化临时(他们实际上通常这样做),那么调用函数a“资源消耗较少”,因为在这种情况下不会产生临时值.但是,对于第一个构造函数调用,您可以这样做:
F f(5,6); // Constructor called; no temporaries are made
了解构造函数的用途:它们用于创建对象.如果您已有对象,则无需调用构造函数.
正如我多次推荐的那样,请拿起good C++ book并阅读.特殊的成员职能及其所做的事情对C来说非常重要.