【问题标题】:C++ Struct with default argument, optionally changeable in constructor具有默认参数的 C++ 结构,可以在构造函数中更改
【发布时间】:2020-06-16 14:30:04
【问题描述】:

假设我有以下结构。

struct vehicle
{
  int    price;                           
  char*  year;                           
  char*  type; 
}

我想为它创建一个常规构造函数,这样我就可以指定每个成员。

尽管如此,我想将成员“type”默认设置为“car”,只需在构造函数中指定“type”,在不常见的情况下,车辆不是“car” ”。

【问题讨论】:

  • 旁白:char* 有什么原因吗? std::string 会更容易使用。
  • 这只是为了简化,同样的问题对于 int 成员 "price" 也是有效的。

标签: c++ struct constructor optional-parameters default-arguments


【解决方案1】:

首先,你没有说出来,但我感觉到一个小误解:结构和类之间的区别只是约定。结构是 C++ 中的类。关键字structclass 可用于声明一个类,唯一的区别是默认访问(根据结构都公共的通用约定)。

顺便说一句,您可以简单地编写两个构造函数(我将std::string 用于字符串,因为我发现 c-strings 非常难以使用):

struct vehicle
{
  int price;                           
  std::string year;                           
  std::string type; 
  vehicle(int p, const std::string& y, const std::string& t) : price(p),year(y),type(t) {}
  vehicle(int p, const std::string& y) : price(p),year(y),type("car") {}
};

你也可以在类初始化器中使用(它们是 C++11 自带的):

struct vehicle
{
  int price;                           
  std::string year;                           
  std::string type{"car"}; 
  vehicle(int p, const std::string& y, const std::string& t) : price(p),year(y),type(t) {}
  vehicle(int p, const std::string& y) : price(p),year(y) {}
};

构造器上的初始化器列表胜过类内初始化器,而在第二个构造器中使用类内初始化器。

【讨论】:

  • 如果我不想使用构造函数怎么办?我会像在示例 2 中那样初始化成员,将 {"car"} 分配给成员 "type",然后当我实例化结构本身时我该怎么办?我尝试了 struct vehicle veh = {2000, "2018"} ,但它不起作用。你知道任何可靠的替代品吗?
  • @pbl 为什么它不起作用?这里看起来不错:godbolt.org/z/bvWVwH
  • @pbl 或者如果你喜欢没有构造函数godbolt.org/z/3R7k8g
  • 我刚刚意识到我的问题是因为我试图对一个不是结构顺序的最后一个成员进行默认分配(例如,这个结构中的“年”)。很遗憾,您只能将最后一个参数用作默认值。
猜你喜欢
  • 2012-11-03
  • 2012-06-30
  • 2017-09-27
  • 2018-04-08
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
相关资源
最近更新 更多