>  기사  >  백엔드 개발  >  C++ 오류: 클래스 멤버는 초기화 목록에서 초기화되어야 합니다. 이를 처리하는 방법은 무엇입니까?

C++ 오류: 클래스 멤버는 초기화 목록에서 초기화되어야 합니다. 이를 처리하는 방법은 무엇입니까?

WBOY
WBOY원래의
2023-08-21 22:24:221087검색

C++ 프로그래밍에서 초기화 목록에서 초기화되지 않은 클래스 정의에 멤버 변수가 있는 경우 컴파일러는 "클래스 멤버는 초기화 목록에서 초기화되어야 합니다."라는 오류를 보고합니다. 이는 개체가 생성될 때 이 멤버 변수의 생성자가 호출되지 않으며 프로그램이 불안정해질 수 있음을 의미합니다.

그래서 C++에서는 클래스의 객체를 생성할 때 초기화 목록을 최대한 활용해야 합니다. 이번 글에서는 초기화 리스트가 무엇인지, 그 사용법과 초기화 리스트에서 클래스 멤버가 초기화되지 않는 오류를 해결하는 방법을 소개하겠습니다.

초기화 목록이란 무엇인가요?

C++에서 클래스의 멤버는 기본 데이터 유형, 배열, 구조, 클래스 등이 될 수 있습니다. 클래스에서 멤버 변수를 정의할 때 생성자 본문에서 초기화하거나 초기화 목록(생성자 초기화 목록)을 사용하도록 선택할 수 있습니다.

초기화 목록은 생성자의 함수 헤더입니다. 초기화 목록을 사용하여 생성자보다 먼저 멤버를 초기화할 수 있습니다. 생성자 본문 앞의 콜론(:) 뒤에 쉼표로 구분된 일련의 초기화 작업입니다. 초기화 목록에서는 여러 멤버 변수를 동시에 초기화할 수도 있고, 초기화를 위해 기본 생성자를 사용할 수도 있어 초기화 목록에서 클래스 멤버가 초기화되지 않아 발생하는 오류를 방지할 수 있습니다.

구문은 다음과 같습니다.

class SomeClass {
public:
    SomeClass(int a, int b, int c) : var1(a), var2(b), var3(c) {
        //构造函数体中的其它操作
    }
private:
    int var1;
    int var2;
    int var3;
};

이 예에서 SomeClass에는 var1, var2, var3의 세 가지 멤버 변수가 있으며 생성자보다 먼저 초기화되고 생성자 본문의 다른 작업은 초기화 목록 후에 수행됩니다.

초기화 목록 사용

  1. 객체 멤버 초기화

클래스에 다른 객체가 클래스 멤버로 있는 경우 초기화 목록을 사용하여 해당 멤버를 초기화할 수도 있습니다. 아래와 같이

class Person {
public:
    Person(int _age, int _id) : age(_age), id(_id), car("BMW", "blue") {
    }
private:
    int age;
    int id;
    Car car;   //Car 是一个类类型成员
};

이 예에서는 초기화 목록을 사용하여 멤버 변수 age, id 및 car를 초기화합니다. 그 중 car 는 Person 클래스의 멤버변수로 Car 타입의 객체이며 "Car car"로 선언된다. Person 객체를 생성할 때 car 멤버도 초기화해야 합니다. 초기화 목록을 사용하는 경우 Car 클래스의 생성자를 사용하여 객체를 초기화해야 합니다.

  1. 타입 변환 초기화

한 타입을 다른 타입으로 변환해야 하는 경우 초기화 목록을 사용할 수 있습니다.

class A {
public:
    A(int val) : a(val), b(val*1.2), c(val*1.5) {}
private:
    int a;
    double b;
    float c;
};

이 예에서는 int 타입 값을 사용하여 초기화도 가능합니다. 기울기.

  1. 읽기 전용 멤버 초기화

때때로 클래스의 멤버 변수는 읽기 전용이어야 하며 객체가 생성될 때만 초기화될 수 있고 생성자 본문 내에서 수정할 수 없습니다. 이는 초기화 목록을 사용하여 달성할 수 있습니다. 아래와 같이:

class B {
public:
    B() : a(5), b(2), c(a*b) {}
private:
    const int a;
    const int b;
    const int c;
};

이 예에서 변수 a, b 및 c는 모두 읽기 전용이며 개체가 생성될 때 모두 초기화되어야 합니다. c는 a와 b의 곱이고 a와 b는 모두 읽기 전용이므로 초기화 목록에서만 연산이 가능하고 여기에 할당된 표현식은 생성자 본문에서 수정할 수 없습니다.

"초기화 목록에서 클래스 멤버를 초기화해야 합니다." 오류를 처리하는 방법은 무엇입니까?

클래스의 객체를 생성할 때 클래스 멤버가 초기화 목록에서 초기화되지 않은 경우 컴파일러는 "클래스 멤버는 초기화 목록에서 초기화되어야 합니다."라는 오류를 보고합니다. 이 오류를 방지하려면 다음 단계를 따를 수 있습니다.

  1. 초기화되지 않은 멤버 변수를 식별합니다.

컴파일러에서 오류 메시지는 초기화 목록에서 초기화되지 않은 멤버 변수를 나타냅니다. 프롬프트에 따라 소스 코드에서 다음과 같은 해당 멤버 변수를 찾을 수 있습니다.

class Test {
public:
    Test() {
        int a = 0;
        std::string b;
    }
};

Test 클래스에는 두 개의 멤버 변수 a와 b가 있습니다. 클래스 생성자의 초기화 목록에서 초기화하지 않았으므로 오류가 보고되었습니다.

  1. 초기화 목록에 멤버 변수를 추가합니다.

필요에 따라 생성자의 초기화 목록에 초기화되지 않은 멤버 변수를 추가합니다. 생성자의 코드를 다음과 같이 수정합니다.

class Test {
public:
    Test() : a(0), b("") {}
private:
    int a;
    std::string b;
};

이 예에서는 초기화 목록을 사용하여 멤버 변수 a와 b를 초기화함으로써 "클래스 멤버는 초기화 목록에서 초기화되어야 합니다."라는 오류를 방지합니다.

Notes

C++에서 초기화 목록을 사용하면 초기화 목록에서 클래스 멤버가 초기화되지 않을 때 발생하는 오류를 피할 수 있을 뿐만 아니라 프로그램의 효율성도 향상됩니다. 생성자 본문에서 초기화가 필요한 경우 클래스 멤버의 생성자가 생성자 끝에서 여러 번 호출될 수 있지만 초기화 목록을 사용하면 한 번만 호출되므로 프로그램의 효율성이 향상됩니다.

또한 멤버 변수가 const 유형인 경우 초기화 목록에서 초기화되지 않으면 컴파일러에서 오류를 보고합니다. 초기화 리스트를 사용할 때에는 멤버변수의 종류와 초기화 방법에 주의해야 한다.

위 내용은 C++ 오류: 클래스 멤버는 초기화 목록에서 초기화되어야 합니다. 이를 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.