C++, что означает унарный оператор, используемый в классе? (Класс:: класс)

Я следовал учебному пособию по YouTube и могу создать базовый класс, но этот учебник не объясняет, как работает Class::Class, я ищу в Google, но знаю только, что он называется унарным оператором и что он делает, но я не знаю, что он делает с Класс, пожалуйста, помогите мне объяснить об этом и большое спасибо.

#include <iostream>
#include <string>

//Class
class Mother {

    public:
        void msg();

};

void Mother::msg(){ //This is where i don't undrstand
    std::cout << "Go home early sweetie" << std::endl;
}

class Daughter: public Mother {

    public:
        void getMsg();

};

void Daughter::getMsg(){ //Same as this
    std::cout << "Mom said ";
    msg();
}


//Main
int main() {

    Daughter lucy;
    lucy.getMsg();

    return 0;
}

2 ответа

Решение

В вашем классе вы объявляете функцию-член msg(), но вы на самом деле не определяете это там:

class Mother {
public:
    void msg();
};

Обычно это объявление помещается в файл.h, и теперь вы хотите поместить определение функции в файл.cpp. Но ты не можешь просто написать

void msg() 
{
  // ..
}

в вашем файле.cpp, так как это определит глобальную функцию, а не функцию-член. Кроме того, компилятор не может знать, что вы действительно пытаетесь определить функцию-член, так как на этом этапе может быть объявлено несколько классов. Таким образом, вам нужен способ сообщить компилятору, что функция живет внутри Mother учебный класс:

void Mother::msg()
{
  //..
}

Тот же синтаксис используется для пространств имен. Взять класс string от std Пространство имен:

std::string myString;

РЕДАКТИРОВАТЬ: специальной функцией является конструктор, имя которого совпадает с именем класса. Определение будет выглядеть так:

Mother::Mother()
{
  // ..
}

В этом конструкторе вы можете инициализировать переменные-члены и вообще настроить экземпляр класса. Все переменные-члены создаются в этой точке. Что теперь, если у вас есть переменная-член типа, в котором вы хотите передать аргумент ее конструктору? Скажем, у вас есть член var с конструктором, который принимает int:

 Mother::Mother() :
   var(1)
 {
   // ..
 }

Так что конструктор var вызывается перед телом конструктора Motherи вы можете передать аргументы к нему.

Class::Class() не является унарным оператором - это конструктор по умолчанию для класса с именем Class, Другими словами, это код, который выполняется, когда у вас есть такой оператор, как:

Class my_instance;

или же

Class another_instance();

код в конструкторе по умолчанию обычно инициализирует поля данных или выделяет системные ресурсы. Аналогом конструктора по умолчанию (или любого другого конструктора) является Destructor, обозначаемый Class::~Class() - который обычно высвобождает ресурсы. Конечно, можно создавать конструкторы и деструкторы для выполнения самых разных задач - у них есть тела, как и у любой другой функции.

Я не совсем уверен, что это поможет вам с примером кода, который вы дали (с msg() метод) - но это то, с чего вы начали свой вопрос, поэтому я надеюсь, что это поможет.

Другие вопросы по тегам