9.3与方法有关的有关内容

9.3与方法有关的有关内容

1.static方法

与数据成员类似,方法有时会应用于全部类对象而不是单个对象。

**static方法不属于特定对象, 因此没有this指针. **用某个特定对象调用 static 方法时,static 方法不会访问这个对象的非 static数据成员。实际上,static 方法就像普通函数,唯一区别在于它可以访问类的 private和 protected 的 static 成员。如果同一类型的其他对象对于static 方法可见(例如传递了对象的指针或引用作为参数),那么 static 方法也可访问其他对象的private 和 protected 的非static 数据成员。

如果要在类的外面调用静态方法,需要用类名和作用域解析运算符来限定方法的名称(就像静态数据成员那样),静态方法的访问控制与普通方法一样。

2.const方法

为了保证方法不改变数据成员,可以用const关键字标记方法本身。

const 说明符是方法原型的一部分,必须放在方法的定义中。

不能将 static 方法声明为 const,因为这是多余的。静态方法没有类的实例,因此不可能改变内部的值。

非const 对象可调用const 方法和非const 方法。然而,const 对象只能调用const方法.

应该养成习惯,将不修改对象的所有方法声明为 const,这样就可在程序中使用const 对象的引用。

注意 const 对象也会被销毁,它们的析构函数也会被调用,因此不应该将析构函数标记为 const。

multable数据成员

将变量设置为multable, 告诉编译器在const()方法中允许改变这个值.

3.方法重载

可重载函数或方法,具体做法是将函数或方法的名称用于多个函数,但是参数的类型或数目不同

C++不允许仅根据方法的返回类型重载方法名称;因为在许多情况下,编译器不可能判断调用哪个方法实例。

3.1基于const的重载

可根据const 重载方法。也就是说,可以编写两个名称相同、参数也相同的方法,其中一个是const,另一个不是。如果是const对象,就调用const 方法;如果是非const对象,就调用非const方法。

通常情况下,const版本和非const版本的实现是一样的。为避免代码重复,可使用Scott Meyer的 const_cast()模式。例如,Spreadsheet类有一个 getCellAt)方法,该方法返回SpreadsheetCell的非const引用。可添加 const 重载版本,它返回 SpreadsheetCell的const 引用。

class Spreadsheet
{
  public:
  	SpreadsheetCell& getCellAt(size_t x, size_t y);
  	const Spreadsheet& getCellAt(size_t x, size_t y) const;
};

const Spreadsheet& Spreadsheet::getCellAt(size_t x, size_t y) const
{
  verifyCoordinate(x, y);
  return m_cells[x][y];
}

Spreadsheet& Spreadsheet::getCellAt(size_t x, size_t y)
{
  return const_cast<SpreadsheetCell&>(as_const(*this).getCellAt(x, y));
}

使用std::as_const()*this转换为const Spreadsheet&, 调用getCellAt()的const版本, 返回const SpreadsheetCell&, 然后使用const_cast(), 将其转换为非const版本的SpreadsheetCell&.

3.2显式删除重载

3.3引用限定方法

可以对类的非临时和临时实例调用普通类方法。

可以显式指定能够调用某个方法的实例类型,无论是临时实例还是非临时实例。这是通过向方法添加一个所谓的引用限定符(ref-qualifier)来实现的。如果只应在非临时实例上调用方法,则在方法头之后添加一个&限定符。类似地,如果只应在临时实例上调用方法,则要添加一个&&限定符。

3.4内联方法

C++提供了这样一种能力∶可以建议函数或方法的调用不在生成的代码中实现,就像调用独立的代码块那样。相反,编译器应将方法体直接插入调用方法的位置。这个过程称为内联(inline),具有这一行为的方法称为内联方法。

可在方法或函数定义的名称之前使用 inline 关键字,将某个方法或函数指定为内联的。

如果编写了内联方法,应该将方法定义与其所在的类的定义放在同一文件中。

3.5默认参数

在原型中可为函数或方法的参数指定默认值。如果用户指定了这些参数,默认值会被忽略∶如果用户忽略了这些参数,将会使用默认值。但是存在一个限制∶**只能从最右边的参数开始提供连续的默认参数列表,否则编译器将无法用默认参数匹配缺失的参数。**默认参数可用于函数、方法和构造函数。

所有参数都有默认值的构造函数等同于默认构造函数。也就是说,可构建类的对象而不指定任何参数。如果试图同时声明默认构造函数,以及具有多个参数并且所有参数都有默认值的构造函数,编译器会报错。因为如果不指定任何参数,编译器不知道该调用哪个构造函数。

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值