Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我们可以直接为任何数据成员赋值。为什么使用构造函数?_C++ - Fatal编程技术网

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

C++ 我们可以直接为任何数据成员赋值。为什么使用构造函数?,c++,C++,我赋值数据成员为什么需要使用构造函数 我不能创建类构造函数,我分配变量的值,我的代码在没有创建构造函数的情况下运行??那么为什么要使用构造函数呢 我的问题是,我们可以直接为任何数据成员赋值。请参阅我的代码: #include <iostream> #include <conio.h> class calculator { public: int n1=100; char grade='a'; // public: // calc

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

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

我的问题是,我们可以直接为任何数据成员赋值。请参阅我的代码:

#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;
}
#包括
#包括
类计算器{
公众:
int n1=100;
煤焦等级='a';
//公众:
//计算器()
// {
//甲级;
//n1=100;
// }
无效显示()
{

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

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

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


此外,大多数成员不应该是
公共的
(因为这使您无法控制如何访问/修改它们),也不应该是
私有的
,构造函数(或类内初始化)C++是面向对象的,面向对象编程的一个主要概念是封装。这个概念是关于两个方面的:首先,将数据工作的方法和方法作为一个单元“捆绑在一起”(在C++中定义)。第二个想法是尽可能地向类的用户隐藏类的数据或内部表示(这称为信息隐藏)。这允许类的实现者在不影响客户端代码的情况下更改类的内部工作方式(可能需要重新编译除外)。因此,具有类的属性(以及实例化的it对象的属性)必须避免使用公共状态。这意味着客户端对对象内部状态的访问只能通过方法调用间接完成。因此,对象的初始化类似地通过构造函数完成。

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

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

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

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;
  }
}
struct C
{
整型字段=-1;
C(常数整型字段)
{
此->字段=字段;
}
C()
{

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

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

当然,还有其他需要构造函数的情况,例如,当类可以接受构造参数时,例如
std::string x(“foo”);


private vs public的主题与构造函数的主题是完全不同的。正如其他答案所提到的,如果您想让类的代码控制所有可以修改的方式,那么您可以将数据成员设置为private。

因为您不应该将属性设置为public…至少受保护,最好是private。ChILD类不应该直接访问父属性,不能中断父类内部行为。坚固原则的打开/关闭原则。请不要用C标记来标记C++问题。C中没有构造函数,请不要标记与封装原理无关的语言。s你隐藏了类方法中的细节。我建议你从中购买和阅读几本书。突然我想访问私有数据成员,例如(员工工资),那么如何访问私有数据意味着如何显示我的类变量的等级和n1??你能举一个私有数据访问的例子吗??@jishanuran“突然间我想访问私有数据成员”-然后向类中添加(
public
)函数,返回所需的数据并调用它。但现在您可以控制数据的计算和返回方式(可能不仅仅是读取单个成员)。您还可以在该函数中添加日志记录和其他任何您喜欢的内容-例如,您可能希望在每次读取某个内容时更新其他一些值。并且该类的内部可以确保没有任何外部突然修改了某个状态而不被它们察觉。感谢重播,我仍然有点困惑。请参阅我的链接:如何显示当我声明一个私有变量?5000个薪水??“一个私有变量只能通过函数访问函数”-什么?不确定你的意思。@ JiShanurura-不,我不打算写教程或者试图教你在OA中的OOP或C++基础知识。
struct C
{
  int field = -1;

  C(const int field)
  {
    this->field = field;
  }

  C()
  {
    std::cout << "Default constructor" << std::endl;

    this->field = 0;
  }
}