鱼C论坛

 找回密码
 立即注册
查看: 1270|回复: 3

组合类,常成员与静态成员

[复制链接]
发表于 2023-6-9 10:23:48 | 显示全部楼层 |阅读模式
3鱼币
可以帮忙讲一下吗(简单会用就可以)谢谢谢谢

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-9 10:25:53 | 显示全部楼层
当然可以,我很乐意帮助你理解这些概念。

1. 组合类(Composition): 组合是一种对象间的关系,意味着一个类可以包含另一个类的对象作为其成员。这是一种非常重要的方式来构建复杂的类。例如,假设我们有一个"Date"类和一个"Person"类,我们可以在"Person"类中包含一个"Date"对象,表示这个人的生日。
class Date {
public:
  Date(int year, int month, int day): year(year), month(month), day(day) {}
  // ...
private:
  int year;
  int month;
  int day;
};

class Person {
public:
  Person(string name, Date birthday): name(name), birthday(birthday) {}
  // ...
private:
  string name;
  Date birthday;
};

然后,你就可以创建一个人,并指定他的生日:
Date birthday(1990, 1, 1);
Person person("Tom", birthday);

2. 常成员(Const Member): 常成员是一种特殊类型的类成员,它的值在对象创建后就不能改变。你可以通过在成员变量前面添加"const"关键字来声明一个常成员。
class MyClass {
public:
  MyClass(int x): x(x) {}
  // ...
private:
  const int x;
};

在这个例子中, x 是一个常成员,一旦对象被创建, x 的值就不能改变。

3. 静态成员(Static Member): 静态成员是属于类的成员,而不是属于类的某个特定对象的成员。这意味着,无论你创建了多少个这个类的对象,静态成员只有一份。静态成员可以是数据成员(变量)或成员函数(方法)。
class MyClass {
public:
  static int x;
  // ...
};

int MyClass::x = 0;  // 初始化静态成员

在这个例子中, x 是一个静态成员。所有的"MyClass"对象都共享这个 x ,并且可以通过类名直接访问它,如"MyClass::x"。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-10 07:07:44 | 显示全部楼层
isdkz 发表于 2023-6-9 10:25
当然可以,我很乐意帮助你理解这些概念。

1. 组合类(Composition): 组合是一种对象间的关系,意味着 ...

Person(string name, Date birthday): name(name), birthday(birthday) {}这一部分的作用和构造函数一样吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-10 09:37:39 | 显示全部楼层
tttttt@@@@@@ 发表于 2023-6-10 07:07
Person(string name, Date birthday): name(name), birthday(birthday) {}这一部分的作用和构造函数一样 ...

是的,这部分代码就是 Person 类的构造函数。构造函数是一种特殊的函数,它在创建类的新对象时自动调用。构造函数的名称与类的名称相同,并且不返回任何值。

在这个例子中, Person(string name, Date birthday)  是构造函数,它接受两个参数——一个字符串和一个 Date 对象。 name(name), birthday(birthday)  是初始化列表,它用来初始化类的数据成员。

初始化列表是在花括号  {}  之前的冒号  :  之后列出的,每个成员用逗号  ,  分隔。每一个初始化都是成员名称后跟括号,括号内是用来初始化该成员的值。在这个例子中,成员  name  和  birthday  分别使用构造函数的参数  name  和  birthday  进行初始化。

在构造函数体运行之前,已经完成了数据成员的初始化。如果没有显式初始化成员变量,那么这些成员将会进行默认初始化。对于内置类型,如果没有进行显式初始化,那么其值将是未定义的。

因此,以下的代码:
Person::Person(string name, Date birthday) : name(name), birthday(birthday) {}

会创建一个 Person 对象,同时初始化其  name  成员为传入的  name  参数值, birthday  成员为传入的  birthday  参数值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 10:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表