C++ Primer Plus 学习笔记 第十章 this指针 对象数组 类作用域 抽象数据类型

this指针指向对象本身, 如果在对象函数内要返回对象本身 就需要解引用 吧对象返回回去 不然返回的是指针本身。

return *this;

 

对象数组:

跟普通的数组一个样 就是要注意 如果没有显示初始化的话 则调用默认构造函数来初始化数组中的每个对象

如果有显示调用构造函数  则编译器会先调用默认构造函数初始化 然后在新建临时对象(用显示调用的构造函数来初始化),然后赋值给数组。 这样就会调用到临时对象的析构函数。

对象数组可以对每个对象元素单独使用不同的构造函数。

可以值部分显示初始化,其余的对象元素 编译器会调用默认构造函数进行初始化。 所以 如果要用对象数组。name所涉及的类中必须要有默认构造函数。

对象的成员运算符可以用., ->, ::  其中指针的话就用->

 

对于作用域为类的常量 不能直接在类声明中声明const int a = 12;

有两个方法

1. 枚举

enum {A = 12};

int a[A]

2. 使用静态变量修饰符

static const A = 12;

 

关于用枚举来定义类作用域的常量 。如果碰到不同的枚举中元素名字相同的话 会出现错误

解决办法是 添加class关键字 也可以使用struct  这样就可以了。

枚举元素默认是int型 但是有时候在使用的时候无法做隐式转换  这时候可以用显示转换将它转换成Int型

int frod = int(t_shirt::Small);

在C++11中 可以指定枚举底层的数据类型, 比如short:

enum class :short pizza {Small, Medium, Large, XLarge};

抽象数据类型:

尽量不涉及到语言的具体类型和特性。这样通用性更强

例子:

stack.h:

#ifndef STACK_H_
#define STACK_H_

typedef unsigned long Item;

class Stack
{
  private:
    enum {MAX = 10};
    Item items[MAX];
    int top;

  public:
    Stack();
    bool isempty() const;
    bool isfull() const;

    bool push(const Item & item);
    bool pop(Item & item);
};

#endif

stack.cpp

#include "stack.h"

Stack::Stack()
{
  top = 0;
}

bool Stack::isempty() const
{
  return top == 0;
}

bool Stack::isfull() const
{
  return top == MAX;
}

bool Stack::push(const Item& item)
{
  if (top < MAX)
  {
    items[top++] = item;
    return true;
  }
  else
    return false;
}

bool Stack::pop(Item & item)
{
  if (top > 0)
  {
    item = items[--top];
    return true;
  }
  else
    return false;
}

stacker.cpp

#include <iostream>
#include <cctype>
#include "stack.h"
int main()
{
  using namespace std;
  Stack st;
  char ch;
  unsigned long po;
  cout << "Please enter A to add a purchase order, \n"
       << "P to process a PO, or Q to quit.\n";
  while (cin >> ch && toupper(ch) != 'Q')
  {
    while (cin.get() != '\n')
      continue;
    if (!isalpha(ch))
    {
      cout << '\a';
      continue;
    }
    switch(ch)
    {
      case 'A':
      case 'a': cout << "Enter a PO number to add: ";
                cin >> po;
                if (st.isfull())
                  cout << "stack already full\n";
                else
                  st.push(po);
                break;
      case 'p':
      case 'P': if (st.isempty())
                  cout << "stack already empty\n";
                else {
                  st.pop(po);
                  cout << "PO #" << po << " popped\n";
                }
                break;
    }
    cout << "Please enter A to add a purchase order,\n"
         << "P to process a PO, or Q to quit.\n";
  }
  cout << "Bye\n";
  return 0;
}

第十章总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@凌晨三点半

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

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

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

打赏作者

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

抵扣说明:

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

余额充值