如何在实现文件中使用构造函数

How to use constructors in an implementation file?

本文关键字:构造函数 文件 实现      更新时间:2023-10-16

我正在编写一个程序,该程序旨在为类- Country -获取用户输入,并计算面积最大的国家以及人口最稠密的国家。但是,我正在使用实现文件。

默认构造函数中应该包含什么?其他构造函数呢?这是我目前所看到的:

#ifndef COUNTRY_H
#define COUNTRY_H
#include <string>

class Country 
{
public:

   Country(string name, double area, int population);
   Country();
   string get_name () const;
   double get_area()const;
   int get_population()const;
   double population_density(Country popDensity) const;

   void largest_area(double a);
   void largest_population(int p);
   void most_dense(double d);

private:
    string name;
    double area;
    int population;
};
#endif

:

#include <iostream>
#include <string>
using namespace std;
#include "COUNTRY_H"
Country :: Country(string name, double area, int population)
{
}
Country :: Country();
{
}

在这种情况下(和大多数情况下),您只是初始化成员,并希望使用初始化器列表。

Country: Country(string _name, double _area, int _population): name(_name),area(_area),population(_population)
{}

为了提高新编码人员的可读性,我更改了参数名称,使它们不完全匹配成员变量名称。编译器不会被初始化列表中相同的实参和成员名所迷惑。

你的默认构造函数可以有一个只有默认值的初始化列表,例如name("Transylvania"),area(5),population(42),但是如果很难想到有意义的默认值,那么不定义默认构造函数是有效的,这样类就需要值才能被构造。

这里有很多错误。

  • 你的实现包括一个名为COUNTRY_H的文件,我认为包括应该是#include "Country.h"
  • 从来没有在任何include语句之前有一个using namespace子句,这可能会导致真正丑陋的bug
  • 你的构造函数按值接受它的字符串参数,但它应该接受const&(即引用到const)

对于默认的actor:它应该为类的每个成员设置一个合理的默认值。如果跳过它,将生成默认构造函数并默认构造每个成员,请记住基本类型(例如int, long)最初具有未定义状态。还要记住,定义任何构造函数都将阻止生成默认构造函数。使用初始化列表来初始化类的成员,不要在构造函数体中这样做。