>

아래 표시된 코드를 모두 고려하십시오. 하나는 생성자를 사용하여 값을 초기화하고 다른 하나는 생성하지 않습니다.

코드 # 1

#include<iostream>
using namespace std;
class Rectangle
{
public:
int width;
int height;
};
int main()
{
Rectangle rect1{3,4};
cout<<"Width="<<rect1.width<<endl;
cout<<"Height="<<rect1.height<<endl;
return 0;
}

출력을 다음과 같이 얻는다

폭 = 3

높이 = 4

코드 # 2

#include<iostream>
using namespace std;
class Rectangle
{
public:
int width;
int height;
Rectangle(int a,int b)
{
width=a;
height=b;
}
};
int main()
{
Rectangle rect1(3,4);
cout<<"Width="<<rect1.width<<endl;
cout<<"Height="<<rect1.height<<endl;
return 0;
}

같은 결과를 얻습니다. 내 질문은 간단 할 수 있지만 두 경우 모두 동일한 출력을 얻을 때 생성자를 사용하는 것이 왜 귀찮습니까? 미리 감사드립니다

  • 답변 # 1

    대답은 아주 간단하고, 생성자 초기화, 다른 방법 할당.

    차이점은 크게 보이지는 않지만이 코드를 고려하십시오.

    #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();
     }
    
    

    이 코드는 num 라는 컴파일 오류를 발생시킵니다  const로 선언되었으며 num 에 값을 할당하려고합니다.   i 와 동일하게함으로써 .

    와이즈 비즈 때문에  그리고 const   references 여야합니다   initialized 직후   와이즈 비즈   declaration 의이 작업 수행  그들.

    또한, 반원들을 사적으로 만드십시오. 좋은 습관이고 훨씬 더 객체 지향적입니다.

    위 코드는

    constructors
    
    

  • 답변 # 2

    간단한 데이터 유형의 경우에는 문제가되지 않지만, 유용하지 않은 초기화를 필요로하거나 심지어 초기화해야하는 평범하지 않은 데이터 유형이 많이 있습니다.

  • 답변 # 3

    생성자에게는 몇 가지 이점이 있습니다.

    생성자는 퍼블릭 API (캡슐화)를 허용합니다. 더 복잡한 클래스에서는 호출자가 건드리지 않아야하는 내부 데이터를 초기화해야 할 수 있습니다.

    initializing
    
    

    DefaultConstructible 및 CopyConstructible과 같은 생성자와 관련된 몇 가지 C ++ 개념이 있습니다. 생성자는 일반적인 인터페이스를 제공하므로 일반 코드는 다른 유형의 객체를 균일 한 방식으로 인스턴스화 할 수 있습니다.

    #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();
      }
    
    

    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; };

  • 이전 c++ - 맞춤 QAbstractItemModel에 적용된 외부 선택
  • 다음 python - 이 방법으로 numpy 배열을 조작하는 방법은 무엇입니까?