首先,[c] 标签是不合适的,因为构造函数是 C++ 独有的特性。我假设您提供的代码 sn-p 实际上是 C++,而不是 C 的一些奇怪的方言。C++ 和 C 是不同的语言;不要将你的问题标记为两者,因为你会得到不同的答案。
第二,你的构造函数定义是错误的。构造函数必须与类本身具有完全相同的名称。所以f() 应该是F()。是的,区分大小写在 C++ 中很重要!我假设这就是你对其余代码 sn-p 的意思。 OP 只是打错了。
在我解释其余代码的作用之前,您必须了解 C++ 中的所有类(和结构)都有special member functions,如果您不提供它们,编译器会自动生成它们。也就是你的代码sn-p基本上是一样的:
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;
对于像ints 这样的原始类型,您可以像这样复制它的值。 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 的对象的普通函数调用。
对于您的代码 sn-p,假设编译器不会优化临时对象(实际上它们通常会这样做),那么调用函数 a 会“占用较少的资源”,因为在这种情况下不会生成临时对象。但是,对于您的第一个构造函数调用,您可以这样做:
F f(5,6); // Constructor called; no temporaries are made
了解构造函数的用途:它们用于创建对象。如果你已经有一个对象,那么你就不需要调用构造函数了。
正如我多次推荐的,请拿起good C++ book阅读。特殊成员函数及其作用是 C++ 的基础。