我们可以直接为任何数据成员赋值. 为什么要使用构造函数?



我赋值数据成员为什么需要使用构造函数?

我无法创建类构造函数,并且分配变量的值,并且我的代码在不创建构造函数的情况下运行?? 那么为什么要使用构造函数

我的问题是 我们可以直接为任何数据成员赋值。 查看我的代码:

#include <iostream>
#include <conio.h>
class calculator {
public:
int n1=100;
char grade='a';
//  public:
// calculator()
// {
//     grade='a';
//     n1=100;
// }
void display()
{
std::cout << "first value:" <<grade<< std::endl;
std::cout << "second value:" <<n1<< std::endl;
}
};
int main()
{
calculator cal;
cal.display();
return 0;
}

O/p 为:

  • 第一个值:A
  • 第二个值:100

以及何时

#include <iostream>
#include <conio.h>
class calculator {

int n1;
char grade;
private:
calculator()
{
grade='A';
n1=100;
}
void display()
{
std::cout << "first value:" <<grade<< std::endl;
std::cout << "second value:" <<n1<< std::endl;
}
};
int main()
{
calculator cal;
cal.display();
return 0;
}

突然我想访问私人数据成员,例如(员工工资(那么如何访问私人数据?

构造函数的工作是初始化对象,使其处于一致且可用的状态。这意味着它应该确保所有成员都有理智的初始值,并应该建立类不变量。

如果您不使用构造函数,而是在每次创建对象时手动初始化成员,那么您首先会到处复制该工作,其次,有时您可能会忘记初始化某些内容 - 这将使对象处于不一致的状态。

此外,大多数成员不应该public(因为这会使您无法控制如何访问/修改它们(,并且当它们被private时,构造函数(或类内初始化(是初始化它们的唯一方法。

构造函数的目的是确保在一致的状态下创建对象。这有助于防止在它们准备好之前使用它们。确实,您可以从调用方执行此操作,但这在两个方面违反了 OOP 封装概念:首先,调用方必须对类的实现有足够的了解才能知道如何正确初始化其内部状态;其次,调用方必须有权访问该状态才能对其进行初始化。

与 C 编程语言不同,C++ 是面向对象的。面向对象编程的主要概念之一是封装。这个概念是关于两件事的。首先,它的想法是,处理数据的数据和方法作为一个单元"捆绑"在一起(在C++的类中定义(。第二个想法是,类的数据或内部表示尽可能对类的用户隐藏(这称为信息隐藏(。这允许类的实现者在不影响客户端代码的情况下更改类的内部工作(除了可能需要重新编译(。因此,要避免将类的属性(以及实例化的对象的属性(作为公共属性。这意味着客户端对对象内部状态的访问只能通过方法调用间接完成。因此,对象的初始化通过构造函数类似地完成。

您可以在一致状态下初始化对象,而无需使用构造函数,只需初始化字段本身。添加新字段时,您可能会忘记向构造函数添加初始化,就像在类本身中添加

初始化一样。事实上,最好在实现构造函数之前将值初始化为某个默认值。

构造函数存在的实际原因是因为您可以

a( 在其中写入逻辑

struct A
{
int field = -1;
A()
{
if(rand() % 2 == 0)
field = 10;
}
};

b( 从外部接收所需的值

struct B
{
int field = -1;
B(const int field)
{
this->field = field;
}
}

c( 重载它们以有多种初始化值的方式

struct C
{
int field = -1;
C(const int field)
{
this->field = field;
}
C()
{
std::cout << "Default constructor" << std::endl;
this->field = 0;
}
}

关于构造函数的主题,您的第一个代码示例很好。 如果隐式生成的构造函数执行了正确的工作(就像在该示例中所做的那样(,那么一定要使用它。

您可能会在教学(学习(上下文中看到类似于第二个示例的内容,其中教师想要展示构造函数的外观。 或者在旧代码中;第一个代码示例中使用的语法直到 C++11 才添加。

当然,在其他情况下,构造函数是必需的,例如,当类可以接受构造参数时,例如std::string x("foo");

私有与公共的主题与构造函数的主题完全不同。如其他答案所述,如果您希望类的代码控制可以修改它们的各种方式,则可以将数据成员设为私有。

最新更新