C++ 为什么我们需要使用构造函数来初始化值,而我们也可以不用构造函数呢? 请考虑下面所示的代码。一个使用构造函数初始化值,另一个不使用

C++ 为什么我们需要使用构造函数来初始化值,而我们也可以不用构造函数呢? 请考虑下面所示的代码。一个使用构造函数初始化值,另一个不使用,c++,C++,代码#1 #包括 使用名称空间std; 类矩形 { 公众: 整数宽度; 内部高度; }; int main() { 矩形rect1{3,4}; cout对于这种简单的数据类型,这可能无关紧要,但是有许多非普通的旧数据类型可以从中受益,甚至需要初始化才能发挥作用。构造函数有几个好处: 构造函数允许公共API(封装)。在更复杂的类中,调用方不应该接触的内部数据可能需要初始化 class Foo { public: Foo(int x) { internal_data1 =

代码#1

#包括
使用名称空间std;
类矩形
{
公众:
整数宽度;
内部高度;
};
int main()
{
矩形rect1{3,4};

cout对于这种简单的数据类型,这可能无关紧要,但是有许多非普通的旧数据类型可以从中受益,甚至需要初始化才能发挥作用。

构造函数有几个好处:

  • 构造函数允许公共API(封装)。在更复杂的类中,调用方不应该接触的内部数据可能需要初始化

    class Foo
    {
    public:
        Foo(int x) {
            internal_data1 = some_computation1(x);
            internal_data2 = some_computation2(x);
        }
    
        Some_Type3 some_method(int x)
        {
            return some_computation3(x, this->internal_data1, this->internal_data2);
        }
    private:
        Some_Type1 internal_data1;
        Some_Type2 internal_data2;
    };
    
  • >P>涉及构造函数的C++概念有很多,如Debug可构造和可复制的构造函数。构造函数提供了一个通用接口,使泛型代码可以以统一的方式实例化不同类型的对象。
    template<class T>
    class Some_Generic
    {
    public:
        Some_Generic(const T& t)
          : internal_t(t) // Copy constructor used
        {
            // do work...
        }
    private:
        T internal_t;
    };
    
    模板
    给一些泛型分类
    {
    公众:
    一些通用(常数T&T)
    :internal\u t(t)//使用的复制构造函数
    {
    //做工作。。。
    }
    私人:
    T内部T;
    };
    

      答案很简单,构造函数初始化,其他方法赋值

      <>这个差别看起来不是很重要,但是考虑一下这个代码。

      #include<iostream>
      using namespace std;
      class Sample
      {
       private:
        const int num;
       public:
        void setval(int i)
         {
          num = i;
         }
        int getVal()
         {
          return num;
         }
      };
      int main()
       {
         Sample s;
         s.setval(12);
         cout<<s.getVal();
       }
      

      您不必使用构造函数,但如果您需要做的不仅仅是为成员赋值,那么构造函数就很方便。只要成员是公共的,您就可以在不使用构造函数的情况下初始化它们。如果成员不是默认可构造的,您需要使用成员初始化列表方法来构造它们
      template<class T>
      class Some_Generic
      {
      public:
          Some_Generic(const T& t)
            : internal_t(t) // Copy constructor used
          {
              // do work...
          }
      private:
          T internal_t;
      };
      
      #include<iostream>
      using namespace std;
      class Sample
      {
       private:
        const int num;
       public:
        void setval(int i)
         {
          num = i;
         }
        int getVal()
         {
          return num;
         }
      };
      int main()
       {
         Sample s;
         s.setval(12);
         cout<<s.getVal();
       }
      
      #include<iostream>
      using namespace std;
      class Sample
      {
        private:
         const int num;
        public:
         Sample( int i):num(i){}
      
         int getVal()
          {
           return num;
          }
      };
       int main()
        {
         Sample s(12);
         cout<<s.getVal();
        }