【问题标题】:What is the purpose of a non-parameterized constructor?非参数化构造函数的目的是什么?
【发布时间】:2021-12-07 23:26:46
【问题描述】:

在非参数化构造函数中初始化类的数据成员有什么好处吗?就像,如果它不带参数,在非参数化构造函数中初始化类数据成员不像直接在类中初始化值? 示例:

class persons {
 private:
   int age, id;
public:
 persons(){
   age = 2;
   id = 3;
 }
};

--> 我们也可以这样做:

class persons {
 private:
   int age = 2, id = 3;
};

那么,默认构造函数的作用是什么?

【问题讨论】:

  • 您的意思并不完全清楚,可能是由于术语(定义->初始化?)。请提供示例代码。
  • 还是不清楚你的意思。您不能在其构造函数中声明类成员变量,这些变量必须声明为类的一部分。您在构造函数中声明的任何变量都是构造函数主体的局部变量。也许一个代码示例可以通过在构造函数中声明成员来阐明您的意思?
  • “在非参数化构造函数中声明类数据成员”声明局部变量。您是说初始化吗?
  • 对不起,但编辑并没有澄清太多(声明也不是正确的词)。请显示一些代码,而不是用英文描述代码
  • "非参数化构造函数" == 默认构造函数

标签: c++ class constructor


【解决方案1】:

在旧的 C++ 版本中,类中的属性声明不能包含初始化。不同的说法

class persons {
    int age = 3;
}

不正确,成员只能在构造函数中接收值。

但是初始化赋值还是有区别的。基本类型无关紧要,但会为用户定义的类使用不同的特殊成员。

例子:

#include <iostream>

// dummy class displaying messages for initializations and assignment
class A {
    int val;

public:
    A(int x = 0) : val(x) {  // initializing constructor
        std::cerr << "Construction from " << x << "\n";
    }
    A& operator =(int x) {  // assignment operator
        val = x;
        std::cerr << "Assignment from " << x << "\n";
        return *this;
    }
};

// 3 classes showing various "initialization" methods
class B {
    A a = 2;     // initialization with an implicit default CTOR
};

class C {
    A a;

public:
    C() : a(3) {};   // initialization
};

class D {
    A a;         // default initialization

public:
    D() {
        a = 4;   // assignment
    }
};

int main() {
    B b;
    C c;
    D d;
    return 0;
}

输出确实是:

Construction from 2
Construction from 3
Construction from 0
Assignment from 4

成员声明中的特殊初始化在所有构造函数之间共享(无论是隐式的还是显式的),并在构造函数的主体之前应用。在任何情况下,成员的初始化都是按照其声明的顺序应用的。

【讨论】:

    猜你喜欢
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多