一个类有多少个默认方法?

35 c++

对不起,这可能看起来很简单,但有人问我这个问题,我不确定.

一个空的C++类带有什么功能?

构造函数,复制构造函数,赋值,析构函数?

是吗?或者还有更多?

Arm*_*yan 47

在C++ 03中有4个:

  • 默认构造函数:仅在未声明用户定义的构造函数时声明.使用时定义

  • 复制构造函数 - 仅在用户尚未声明时才声明.如果使用则定义

  • 复制赋值运算符与上述相同

  • 析构函数与上面相同

在C++ 11中还有两个:

  • 移动构造函数
  • 移动赋值运算符

编译器也可能无法生成其中的一些.例如,如果类包含例如引用(或任何其他无法复制分配的引用),则编译器将无法为您生成复制赋值运算符.欲了解更多信息,请阅读

  • 它实际上是关于移动构造函数和移动赋值运算符是否将在C++ 0x中隐式声明; Dave Abrahams和Bjarne Stroustrup在10月WG21邮件中就此主题发表了论文.有人担心隐含声明它们可能会破坏遗留代码. (5认同)

Mar*_*ork 12

如果我定义以下类

class X
{};
Run Code Online (Sandbox Code Playgroud)

编译器将定义以下方法:

X::X()  {}                    // Default constructor. It takes zero arguments (hence default).
X::~X() {}                    // Destructor
X::X(X const& rhs) {};        // Copy constructor
X& operator=(X const& rhs)
{return *this;}              // Assignment operator.
Run Code Online (Sandbox Code Playgroud)

注意:
如果定义了任何构造函数,则不构建默认构造函数.
如果用户定义了替代方法,则不会构建其他方法.

更有趣的是当我们有成员和基数时的默认实现:

class Y: public X
{
    int    a;      // POD data
    int*   b;      // POD (that also happens to be a pointer)
    Z      z;      // A class
};

// Note: There are two variants of the default constructor.
//       Both are used depending on context when the compiler defined version
//       of the default constructor is used.
//
//       One does `default initialization`
//       One does `zero initialization`

// Objects are zero initialized when
//   They are 'static storage duration'
//   **OR** You use the braces when using the default constructor
Y::Y()      // Zero initializer
    : X()   // Zero initializer
    , a(0)
    , b(0)
    , z()   // Zero initializer of Z called.
{}

// Objects are default initialized when
//    They are 'automatic storage duration'
//    **AND** don't use the braces when using the default constructor
Y::Y()
    :X    // Not legal syntax trying to portray default initialization of X (base class)
    //,a  // POD: uninitialized.
    //,b  // POD: uninitialized.
    ,z    // Not legal syntax trying to portray default initialization of z (member)
{}
//
// Note: It is actually hard to correctly zero initialize a 'automatic storage duration'
//       variable (because of the parsing problems it tends to end up a a function
//       declaration). Thus in a function context member variables can have indeterminate
//       values because of default initialization. Thus it is always good practice to 
//       to initialize all members of your class during construction (preferably in the
//       initialization list).
//
// Note: This was defined this way so that the C++ is backward compatible with C.
//       And obeys the rule of don't do more than you need too (because we want the C++
//       code to be as fast and efficient as possible.


Y::Y(Y const& rhs)
    :X(rhs)              // Copy construct the base
    ,a(rhs.a)            // Copy construct each member using the copy constructor.
    ,b(rhs.b)            // NOTE: The order is explicitly defined
    ,z(rhs.z)            //       as the order of declaration in the class.
{}

Y& operator=(Y const& rhs)
{
    X::operator=(rhs);   // Use base assignment operator
    a  = rhs.a;          // Use the assignment operator on each member.
    b  = rhs.b;          // NOTE: The order is explicitly defined
    z  = rhs.z;          //       as the order of declaration in the class.
    return(*this);
}

Y::~Y()
{
    Your Code first
}
// Not legal code. Trying to show what happens.
  : ~z()
  , ~b() // Does nothing for pointers.
  , ~a() // Does nothing for POD types
  , ~X() ; // Base class destructed last.
Run Code Online (Sandbox Code Playgroud)


小智 7

只是为了扩展Armen Tsirunyan,这里的答案是这些方法的签名:

// C++03
MyClass();                                     // Default constructor
MyClass(const MyClass& other);                 // Copy constructor
MyClass& operator=(const MyClass& other);      // Copy assignment operator
~MyClass();                                    // Destructor

// C++11 adds two more
MyClass(MyClass&& other) noexcept;             // Move constructor
MyClass& operator=(MyClass&& other) noexcept;  // Move assignment operator
Run Code Online (Sandbox Code Playgroud)