c++ primer之类

  • 类的基本思想是数据抽象封装
  • 数据抽象是一种依赖于接口实现分离的编程(以及设计)技术。类的接口包含用户所能执行的操作,类的实现则包含类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。
  • 封装实现了类的接口和实现的分离。封装后的类隐藏了它的实现细节,也就是说,类的用户只能使用接口而无法访问实现部分。

类成员再探
- 类中除了定义数据和函数成员之外,类还可以自定义某种类型在类中的别名。由类定义的类型名字和其他成员一样存在访问限制,可以是public或者private中的一种。

 例:
 class Screen
 {
 public:
      typedef std::string::size_type pos;
      // 使用类型别名等价地声明一个类型名字
      // 也就是: using pos = std::string::size_type;
      Screen() = default;  //因为Screen有另一个构造函数,所以本函数是必需的
      Screen(pos ht, pos wd, char c): 
                                 height(ht), weight(wd), contents(ht*wd,c){ }
 private:
      // 类内初始化
      pos cursor = 0;
      pos height = 0, width = 0;
      std::string contents;
 };
 class Window_mgr
 {
 private:
     std::vector<Screen> screen(Screen(24, 80, ' '));
 };
  • 注意,用来定义类型的成员必须先定义后使用,这一点与普通成员有所区别(普通成员,可以在之后声明,因为程序在编译的时候,会先编译声明部分,在编译定义的内容)。
  • 另外,类内初始值是c++11的新特性,必须使用=的初始化形式或者花括号括起来的直接初始化形式。
  • 因为我们已经提供了一个构造函数,所以编译器将不会自动生成默认构造函数。如果我们需要默认构造函数,必须显式地把它表明出来。在此例中我们使用=default告诉编译器为我们合成默认构造函数。其实就是重载构造函数。

可变数据成员

  • 声明可变数据成员,只需要在数据类型前面加 mutable 即可;
class Screen
{
public:
    void some_member() const;
private:
    mutable size_t  access_ctr; //即使是一个const对象内也能被修改
};

void Sreen::some_member() const
{
   ++access_ctr;  // 即使是const函数,也可以修改值,因为它声明的是可变数据成员。
}

类类型

  • 每个类定义了唯一的类型,对于两个类来说,即使它们的成员完全一样,这两个类也是两个不同的类型。(不存在两个类相同的情况)
例:
struct First{
      int memi;
      int getMem();
};
struct Second{
     int memi;
     int getMem();
};
First obj1;
Second obj2 = obj1;     // 错误:obj1和obj2的类型不同
  • 我们可以把类名作为类型的名字使用,从而直接指向类类型。或者,我们也可以把类名字跟在关键字class或struct后面:
Sales_data item1;               // 默认初始化Sales_data类型的对象
class Sales_data item1;     // 一条等价的声明(从c语言继承而来)

类的声明

  • 就像可以把函数的声明和定义分离开来一样,我们也能仅仅声明类而暂时不定义它:
    class Screen; // Screen类的声明

友元的声明

  • 友元的声明(并不代表函数声明)仅仅指定了访问权限,而非一个普通意义上的函数声明。如果我们希望类的用户能够调用某个友元函数,那么我们就必须在友元声明之外再专门对函数进行一次声明。另外为了使友元对类的用户可见,我们通常把友元的声明与类本身放置在同一个文件件中。
例:
struct X
{ 
     // 就算在类的内部定义函数,我们也必须在类的外部提供相应的声明从而是函数可见。
     friend void f(){/* 友元函数可以定义在类的内部 */}
     X() {f();}   // 错误: f还没有被声明
     void g();
     void h();
};
void x::g() { return f(); }  // 错误:f还没有被声明
void f();   // 声明那个定义在X中的函数
void X::h() { return f(); }  // 正确:现在f的声明在作用域中了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MachineLP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值