C++Primer学习-类(类的定义和声明)

在C++中,用类定义抽象数据类型。

一、类定义:

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

1.类成员

   访问标号:public定义的成员可以被使用该类型的所有代码访问。

                     private定义的成员可以被其他类成员访问。

2.构造函数

   创建一个类对象时,编译器会自动使用一个构造函数初始化该对象。

   构造函数一般使用一个构造函数初始化列表来初始化数据成员。

Sales_item():units_sold(0),revenue(0){}
   构造函数初始化列表 由成员名和带括号的初始值组成,跟在构造函数的形参表之后,以 : 开头。

3.成员函数
   在类内部定义的函数默认为内联函数(inline)。
   在类外部定义的函数必须指明它们是在类的作用域中。
   const关键字加在形参表之后,就可以将成员函数声明为常量。
   const必须同时出现在声明和定义中,若只出现在一处,则出现编译时错误!!!

二、数据抽象和封装
       数据抽象:接口和实现分离,类的设计者关心类如何实现,但使用者不必了解这些细节。
       封装是将 低层次的元素组合起来形成新的、高层次实体的技术!

1.访问标号实施抽象和封装
   1)public标号的成员:程序所有部分都可以访问。
   2)private标号的成员:使用类的代码不可以访问。封装了类型的实现细节。
【class与struct的区别】
struct:在第一个访问标号之前的成员是公有的。
class:在第一个访问标号之前的成员是私有的。
【具体类型和抽象类型】
标准库中pair类是一个实用的、设计良好的具体类,具体类暴露其实现细节。

2.编程角色
   好的类设计者会定义直观和易用的类接口,而用户只需关心类中影响他们使用的那部分实现。

【注解】
   改变头文件中的类定义可有效地改变包含该头文件的每个源文件的程序文本。so,当类发生改变时,使用该类的代码必须重新编译。

三、关于类定义的更多内容
       C++语言为类提供了相当多的支持(C With Class)
1.同一类型的多个数据成员
   类的数据成员声明类似于普通变量的声明

2.使用类型别名类简化类
   除了定义数据和函数成员外,类还可以定义自己的局部类型名(typedef)。此类将是一个更好的抽象。

3.成员函数可以被重载
   成员函数只能重载本类的其他成员函数。
   两个重载成员的形参数和类型不能完全相同。

4.显式指定inline函数
   类内部定义成员函数,默认就是inline函数。但也可以显式的将成员函数指定为inline。
   在声明和定义处指定inline都是合法的,在类外部定义inline好处是可以使类比较容易阅读。
   不在类定义体内定义的inline成员函数,其定义通常应放在有类定义的同一头文件中。

四、类声明和类定义
       在给定的源文件中,一个类只能被定义一次。如果在多个文件中定义一个类,那每个文件中的定义必须是完全相同的。
//前向声明
class Screen;
在声明之后、定义之前,类Screen是一个不完全类型,即:已知Screen是一个类型,但不知道包含哪些成员。
       不完全类型(incompletetype)只能以有限方式使用。不能定义该类型的对象。只能用于定义指向该类型的指针及引用,或用于声明使用该类型作为形参类型或返回类型的函数。
       在创建类的对象之前,必须完整的定义该类。必须是定义类,而不是声明类,这样编译器就会给类的对象预定相应的存储空间。同样,在使用引用或指针访问类的成员前,必须已经定义类。

    为类的成员使用类声明:
       如果该类型是不完全类型,那数据成员只能是指向该类类型的指针或引用。
       因为只有当类定义体完成后才能定义类,因此类不能具有自身类型的数据成员。然而,只要类名一出现就可以认为该类已声明。因此,类的数据成员可以是指向自身类型的数据指针或引用。
class LinkScreen
{
    Screen Window;
    LinkScreen *next;
    LinkScreen *prev;
};
类的前向声明一般用来编写相互依赖的类。
class Y;
class X
{
    Y *y;
};

class Y
{
    X x;
};

五、类对象
       定义一个类时,也就定义了一个类型。一旦定义了类,就可以定义该类型的对象。定义对象时,将为其分配内存空间,但(一般而言)定义类型时不进行存储分配。
       通过类定义出的对象都具有自己的类数据成员的副本。修改其中一个对象不会改变其他该类对象的数据成员。
1.定义类类型的对象
定义了一个类类型后,可以按以下两种方式使用。
   1)将类的名字直接用作类型名
   2)指定关键字class或struct,后面跟类的名字:
//两条语句作用相同
Screen scr;
class Screen scr;
2.为啥类的定义以分号结束
因为在类定义之后可以接一个对象定义列表,所以必须以分号结束:
class Sales_item
{
   //...
};

class Sales_item
{
   //...
}ccum,trans;

【最佳实践】
通常,将对象定义成类定义的一部分是个坏主意!!!这样,会使所发生的操作难以理解。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值