考虑这个link。看到这段代码:
class MyClass
{
public:
MyClass();
~MyClass();
private:
int _a;
};
MyClass::MyClass()
{
}
MyClass::~MyClass()
{
}
我们可以在类中声明构造函数 为什么我可以在类中声明构造函数以及为什么要这样做?
答案 0 :(得分:13)
你不能声明构造函数。您正在谈论构造函数定义。
class MyClass
{
public:
MyClass(); // declaration
};
MyClass::MyClass() // definition
{
}
您应该阅读this。
为了便于阅读,你应该在类之外定义构造函数的主要原因。在Header文件中声明您的类并在源文件中定义它更清楚。您可以将此规则应用于您班级的任何成员。
标准的一点引用:
12.1构造函数
struct S {
S(); // declares the constructor
};
S::S() { } // defines the constructor
答案 1 :(得分:7)
你做不到。这是构造函数声明,它必须在类定义中:
// MyClass definition, possibly in .h file
class MyClass
{
public:
MyClass(); // default constructor declaration
...
};
这是构造函数定义
// MyClass default constructor definition, possibly in .cpp file
MyClass::MyClass() { }
您所指的是构造函数定义。您可以在类定义之外定义它,以允许您将一个与另一个解耦。通常这意味着您将类定义放在头文件中,由客户端代码包含,并将构造函数定义(以及其他类成员函数定义)放在要编译的实现文件中。这样,代码的用户对所述定义没有编译时依赖性。
答案 2 :(得分:6)
定义类声明之外的构造函数(或任何成员函数)的主要原因是,您可以拥有头文件和实现文件。这使您的代码更清晰,并允许您将类的接口(头文件)分发,而不提供实现细节。
答案 3 :(得分:1)
您不能声明构造函数或类之外的任何部分,但您可以定义
这是一种常见的c ++编程实践,使用 2个文件进行1类
例如,
class ClassG
{
public:
ClassG();
~ClassG();
void anyfunc(int anyarg);
private:
int anydata;
};
#include"ClassG.h"
ClassG::ClassG()
{
//something
}
ClassG::~ClassG()
{
//something
}
void ClassG::anyfunc(int anyarg)
{
//something
}
声明时,在.h文件类型returntype methodname(args_if_any);
内
在.cpp文件中定义时,键入returntype ClassName::methodname(args_if_any){}
答案 4 :(得分:0)
首先,你的术语很混乱,你需要阅读What is the difference between a definition and a declaration?
。你不能declare
一个类之外的构造函数,但你可以在类之外define
。
就像你的意思那样问题:
为什么我可以在类
之外定义构造函数
基本上标准对member function
部分中9.3.2
的说法如下:
成员函数可以在其类定义中定义(8.4),在这种情况下,它是内联成员函数(7.1.2),或者如果已经声明了它,则可以在其类定义之外定义它在其类定义中定义。
所以标准说这没关系,下一个问题:
为什么我们应该这样做?
它使您的代码更清晰,更容易消化,您可以将声明分隔为头文件,将实现分离为源文件。前一个帖子Why have header files and .cpp files in C++?更详细地讨论了这个主题。
答案 5 :(得分:0)
是的,您可以在类中定义构造函数,无论您是否 使用.h文件或.cpp文件。实际上这两个文件的主要区别在于, 头文件永远不会编译它只用于在编译.cpp期间检查语法 文件。
默认情况下在内部函数中定义的方法。如果你定义一个 在类中的构造函数没关系,但是,如果你需要定义多个 构造函数然后发生2个问题
问题1:
我们知道,当你调用内联函数时,它会粘贴被调用的代码
增加代码大小并需要更多内存的函数。
问题2: 降低代码的可读性。