如果我在已构造的对象或结构上调用构造函数,
它会分配新空间,还是只使用现有空间?那么第一个对象分配是否更加资源密集?像这样:
它会分配新空间,还是只使用现有空间?那么第一个对象分配是否更加资源密集?像这样:
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)
解决方法
首先,[c]标签是不合适的,因为构造函数是一个C-only特征.我假设你提供的代码片段实际上是C而不是C. C和C的一些奇怪的方言是不同的语言;不要将你的问题标记为两者,因为你会得到不同的答案.
其次,构造函数定义是错误的.构造函数必须与类本身具有完全相同的名称.所以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)
对于你的代码片段,假设编译器没有优化临时(他们实际上通常这样做),那么调用函数a“资源消耗较少”,因为在这种情况下不会产生临时值.但是,对于第一个构造函数调用,您可以这样做:
F f(5,6); // Constructor called; no temporaries are made
了解构造函数的用途:它们用于创建对象.如果您已有对象,则无需调用构造函数.
正如我多次推荐的那样,请拿起good C++ book并阅读.特殊的成员职能及其所做的事情对C来说非常重要.