C++ 类

本文深入探讨C++中类的定义与声明,解析数据抽象与封装原理,介绍类作用域与成员函数特性,以及static类成员的使用。通过实例说明this指针的作用与const成员函数限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1  类的定义和声明

1.1. 类的定义和声明

  最简单地来说,类就是定义了一个新的类型和一个新的作用域。

  类成员:可以是数据 、函数或者类型别名。

  构造函数:Sales_item():units_sold(0),revenue(0.0){}

  成员函数:在类内部,声明成员函数时必须的,而定义成员函数则是可选的。

                     double avg_price() const; const成员不能修改其所操作的对象的数据成员。const必须同时出现在声明和定义中,若只出现在其中一处,就会出现一个编译时错误。

1.2 数据的抽象和封装

      类背后蕴含的思想是数据抽象和封装。数据抽象是一种依赖接口和实现分离的编程技术。封装是一项将低层次的元素组合起来形成新的高层次实体的技术。函数是一种封装形式。同样的类也是一个封装实体:它代表了若干成员的聚集,大多数类类型隐藏了实现该类型的成员。

      访问下标实施抽象和封装

      数据抽象和封装提供了两个重要的优点:

      1.避免类内部出现无意的,可能破坏对象状态的用户级错误。

      2.随着时间推移可以根据需求改变或缺陷报告来完善类的实现,而无须改变用户级代码。

1.3 类的声明和定义

     在一个给定的源文件中,一个类只能被定义一次。如果在多个文件中定义一个类,那么每个文件中的定义必须是完全相同的。将类定义放在头文件中,可以保证在每个使用类的文件中以相同的方式定义类。在声明之后定义之前。类screen是一个不完全类型,即已知screen是一个类型,但不知道包含哪些成员。不完全类型只能以有限方式使用。不能定义该类型的对象。不完全类型只能用于定义指向该类型的指针和引用,或者用于声明使用该类型作为形参类型或返回类型的函数。在创建类的对象之前,必须完整地定义类,而不是声明类,这样,编译器就会给类的对象预定相应的存储空间。同样地,在使用引用或者指针访问类的成员之前,必须已经定义类。如果该类型是不完全类型,那么数据成员只能是指向该类类型的指针或引用。类的前向声明一般用来编写互相依赖的类。

2.隐藏的this指针

  2.1 尽管在成员函数内部显式引用this通常是不必要的,但有一种情况下必须这样做:当我们需要将一个对象作为整体引用而不是引用对象的一个成员时,最常见的情况是在这样的函数中使用this,该函数返回对调用该函数的对象的引用。

 2.2 从const成员函数返回*this

      从普通的非const成员函数中,this的类型是一个指向类类型的const指针。可以改变this所指向的值,但不能改变this所保存的地址。在const成员函数中,this的类型是一个指向const类类型对象的const指针。即不能改变this所指向的对象,也不能改变this所保存的地址。不能从const成员函数返回指向类对象的普通引用。const成员函数只能返回*this作为一个const引用。

 2.3基于const的重载

     const对象只能使用const成员,非const对象可以使用任一个成员,但非const版本是一个更好的匹配。

3. 类作用域

    友元

   SalesItem.h文件中 直接定义类StudentInfo为友元类

   class SalesItem {
   public:
    friend class StudentInfo;

private:
    static int aCityNumber;

在StudentInfo.h文件中
#include "SalesItem.h"   需要包含SalesItem.h头文件

std::string GetSlasItem(SalesItem salesItem)
{
    return salesItem.aSalesName;
}
可以随意调用SalesItem里面的私有变量。

4.static 类成员

 非static数据成员存在于类类型的每个对象中。不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联。static成员函数没有this形参,它可以直接访问类的static成员,但不能直接使用非static成员。当我们在类的外边定义static成员时,无须重复指定static保留字,该保留字只出现在类定义体内部的声明处。

static成员函数不能被声明为const,毕竟将成员函数声明为const就是承诺不会修改该函数所属的对象。

static数据成员必须在类定义体的外部定义(正好一次)。不像普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。保证对象正好定义一次的最好办法,就是将static数据成员的定义放在包含类的非内联成员函数定义的文件中(比如studentinfo.cpp中)。有一个例外,主要初始化是一个常量表达式,整形const static数据成员就可以在类的定义体中进行初始化。

   private: static const int aAreaNumber=10;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值