Может ли конструктор быть определен вне класса?

#c

#c

Вопрос:

Почему gcc не может успешно скомпилировать один из приведенных ниже кодов? Может ли конструктор быть определен вне класса?

 #include <string>
using std::string;

class Person{
public:
    Person(const string amp;a, const string amp;b);
private:
    string name, address;
};

Person::Person(const string amp;a, const string amp;b){
    name(a);
    address(b);
}
  

Спасибо!

Ответ №1:

Потому что ни name ни address не могут быть вызваны. Вы, вероятно, имели в виду поместить их в список инициализаторов элементов.

 Person::Person(const string amp;a, const string amp;b)
    : name(a), address(b)
{
}
  

Ответ №2:

Ваш синтаксис неправильный:

 Person::Person(const string amp;a, const string amp;b) : name(a), address(b) {}
  

Ответ №3:

Вы просто написали это неправильно. Это должно быть:

 Person::Person(const string amp;a, const string amp;b) :  name(a), address(b) { }
  

В принципе, и в значительной степени на практике, вы можете и должны определять функции-члены вне определения класса, чтобы отделить базу кода и сократить время компиляции.

Ответ №4:

Это называется разделением реализации и объявления. На самом деле хорошей идеей является сохранение ваших реализаций отдельно, в cc или cpp файле.

Таким образом, в вашем заголовке:

 //Person.h
#ifndef PERSON_H  //  <---- include header guards in your headers
#define PERSON_H

#include <string>
//using std::string; <--- you should remove this line, you don't want to import namespaces
//                        in your header file, or else they are imported in all 
//                        files including this header

class Person{
public:
    Person(const std::string amp;a, const std::string amp;b);
private:
    std::string name, address; // qualify your names in the header
};

#endif
  

и ваш файл реализации:

 //Person.cpp
#include "Person.h"
using namespace std;  //  <---- if you wish, import the std namespace in your global namespace
                      //        in the implementation file
Person::Person(const string amp;a, const string amp;b):
    name(a),       // <---- correct syntax of initializer lists 
    address(b)
{
}