可以在类中定义构造函数吗?

时间:2011-11-04 13:58:21

标签: c++

为什么gcc无法编译下面的代码成功? 可以在类中定义构造函数吗?

#include <string>
using std::string;

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

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

谢谢!

4 个答案:

答案 0 :(得分:13)

因为nameaddress都不可调用。您可能打算将它们放入member-initializer-list。

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

答案 1 :(得分:6)

您的语法错误:

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

答案 2 :(得分:3)

你刚写错了。它应该是:

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

原则上,在实践中也是如此,你可以而且应该在类定义之外定义成员函数来解耦代码库并减少编译时间。

答案 3 :(得分:2)

这称为实施和声明的分离。实际上,在cccpp文件中单独保留您的实施是个好主意。

因此,在你的标题中:

//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 &a, const std::string &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 &a, const string &b):
    name(a),       // <---- correct syntax of initializer lists 
    address(b)
{
}