C++复习

2020-06-14  本文已影响0人  良木lins

C++谭版期末复习

前言

好好复习,简单看看语法

从C到C++

C++的输入输出

const定义常变量

函数

变量的引用

作用域运算符 ::

字符串变量 string

动态内存分配/撤销

类和对象的特性

概述

类的声明和对象的定义

类的成员函数

对象成员的引用

类的封装性和信息隐蔽

类和对象的使用

构造函数

析构函数

对象数组-对象指针

  1. 对象数组
    注意二义性
    class lins{
     lins(int a,int b,int c):aa(a),bb(b),cc(c){};
     int aa, bb, cc;
    }
    
    lins ls1[3] = {1,2,3}; //一个数据给一个对象
    lins ls2[3] = {
     lins(1,1,1),
     lins(2,2,2),
     lins(3,3,3)
    }
    
  2. 对象指针
    • 指向对象的指针 lins *p
    • 指向对象成员的指针
      1. 指向对象数据成员
       int *p;
       p = &t.a;
       cout << *p << endl;
      
      2. 指向对象成员函数
       void(lins::*p)();
       p = &lins::fun;
       // p = &t.fun; 错误!因为函数地址是公用的,在对象外的空间
       (*p) (); //调用fun函数
      
    • 指向当前对象的this指针

共用数据的保护

  1. 常对象
    • const lins ls(); = lins const ls();
    • NOTES:
      • 在定义常对象时,必须同时对之初始化,之后不能再改变
      • 常对象只能调用它的常成员函数
      • 常成员函数可访问常对象中的数据成员,但不允许修改常对象中数据成员的值
      • mutable int a; 可修改
  2. 常对象成员
    • 常数据成员:只能通过构造函数的参数初始化表进行初始化
    • 常成员函数:void fun() const;
    • note:常成员函数不能调用另一个非const成员函数
  3. 指向对象的常指针
    • lins * const p; --指向不能变,值可以变
    • 不能指向常对象
  4. 对象的常指针
    • const lins *p; --指向对象的值不能变,指向可以变
    • 可以指向常对象
  5. NOTE:非const能变为const,反之不能
  6. 对象的常引用
    • void fun(const lins &ls);
    • 经常用常指针和常引用作函数参数

对象的动态建立和释放

对象的赋值和复制

  1. 赋值
    • lins l1,l2; ... l2 = l1;
    • 只对其同类的数据赋值,不对函数赋值
    • 数据成员中不能包括动态分配的数据,否则在赋值时可能出现严重后果
  2. 复制
    • 复制构造函数:也是构造函数,但它只有一个本类对象的参数。编译系统提供一个默认的复制构造函数。
    • lins::lins(const lins &l);
    • lins l2(l1); lins l2 = l1, l3 = l1; 等价,均复制了一个l1
    • 调用情况
      1. lins l1 = l2;
      
      2. void fun(lins lt){};
         fun(l1); //调用复制构造函数创建lt
      
      3. lins fun(){ return l1; } 
         lins l2 = fun();//返回时调用复制构造函数
      

静态成员

  1. 静态数据成员
    • static int a;
    • 静态数据成员不属于某一个对象,静态数据成员在对象之外单独开辟空间。
    • 程序编译时被分配空间的,到程序结束时才释放空间。
    • 静态数据成员可以初始化,但只能在类体外进行初始化。int lins::a = 1;
    • 如果未对静态数据成员赋初值则编译系统会自动赋予初值0。
    • 引用
      • 对象名 l1.a;
      • 类名 lins::a;
      • 私有静态数据成员不能在类外直接引用,必须通过公用的成员函数引用
    • 公用静态数据成员与全局变量的不同,静态数据成员的作用域只限于定义该类的作用域内
  2. 静态成员函数
    • static int fun();
    • 类外调用公用的静态成员函数,lins::fun();l.fun();
    • 主要用来访问静态数据成员而不访问非静态成员。无this指针,如要访问通过l.a;的方式。

友元

  1. 友元函数
    • 将普通函数声明为友元函数 friend void display(lins &);
    • 友元成员函数
      • 需要类的提前引用声明
      • friend void lins::display(lins &); 表明lins类中的display函数能访问本类中的成员
    • 可以被多个类声明为“朋友”
  2. 友元类
    • friend lins; 表明类lins中的所有成员都可以访问本类中的成员
    • 友元的关系是单向的而不是双向的
    • 友元的关系不能传递

类模板

运算符重载

重载方法

重载运算符规则

  1. 仅能对已有运算符重载
  2. 不允许重载的(五个)
    • .*::sizeof? :
  3. 不能改变运算符运算对象(即操作数)的个数,结合性,优先级
  4. 重载函数不能有默认的参数
  5. 重载的运算符必须和类的对象一起使用,其参数至少有一个是类对象(或类对象的引用)
  6. 类的运算符一般都需要重载,但= &不用

类的运算符重载

  1. 重载函数作为类的成员函数
  2. 重载函数作为普通函数,在声明为友元函数

重载双目

class lins{
  private:
    int x;
  public:
    friend bool operator > (lins &l1, lins &l2);

    //或者
    bool operator > (lins &l2) {
      return this.x > l2.x;
    }
}

bool operator > (lins &l1, lins &l2){
  return l1.x > l2.x;
}

重载单目

特殊++,--
1. ++i  前置
2. i++  后置 多一个int参数,本身无意义

class lins {
  private:
    int x;
  public:
    //前置
    lins operator ++ () {
      x++;
      return *this;
    }
    //后置
    lins operator ++ (int) {
      lins t(*this);
      x++;
      return t;
    }
}

重载<<>>

不同数据类型间的转换

继承与派生

概述

派生类的构成

  1. 从基类接收成员
    • 除构造,析构函数外,都会接受。
    • 很容易产生冗余(可通过虚函数解决)
  2. 调整从基类接收的成员
    • 改变访问属性
    • 创建同名函数来覆盖(注意不是重载)
  3. 在声明派生类时增加的成员

派生类成员的访问属性

  1. 公用继承 public
    • 基类的公有、保护成员在派生类中保持原有访问属性
    • 基类私有成员仍为基类私有
  2. 私有继承 private
    • 基类的公有、保护成员在派生类中成了私有成员
    • 基类私有成员仍为基类私有
  3. 受保护继承 protected
    • 基类的公有、保护成员在派生类中成了保护成员
    • 基类私有成员仍为基类私有

派生类的构造函数和析构函数

多重继承

基类与派生类的转换

长的可以赋值给短的,短的指针可以指向长的(短的只能接受/访问部分)

多态性与虚函数

多态性

由继承而产生的相关的不同的类,其对象对同一消息会作出不同的晌应。

表现:具有不同功能的函数可以用同一个函数名,这 样就可以用一个函数名调用不同内容的函数。

分类:

利用虚函数实现多态性

作用:允许在派生类中重新定义与基类同名的函数并且可以通过基类指针或引用来访问基类和派生类中的同名函数

虚函数的使用

Note:使用虚函数,系统要有一定的空间开销。当一个类带有虚函数时,编译系统会为该类构造一个虚函数表(virtual function table,简称 vtable),它是一个指针数组,存放每个虚函数的人口地址。系统在进行动态关联时的时间开销是很少的,因此,多态性是高效的。

虚析构函数:

纯虚函数与抽象类

纯虚函数

抽象类

输入输出流

C++的输入输出

cin coutiostream 的对象

C++的流库

标准输出流

  1. cout cerr和clog流
  2. 标准类型数据的格式输出
  3. 用流成员函数put输出字符 cout.put("a");

标准输入流

  1. cin流
  2. 用于字符输入的流成员函数 cin.get(); cin.getline();
  3. istream 类的其他成员函数

文件流

文件可分为:ASCII码、二进制

文件流类与文件流对象

文件的打开与关闭

  1. 打开磁盘文件
    ofstream outfile; ///定义ofstream类(输出文件流类)对象outfile 
    outfile.open("f1.txt", ios::out); //使文件流与 f1.txt文件建立关联 
    
    open的一般形式: 
    文件流对象.open(磁盘文件名, 输入输出方式); 
    
    参数
    ios::in, ios::out, ios::out||ios::binary, ios::in||ios::binary
    
  2. 关闭磁盘文件 outfile.close();

对ASCII文件的操作

对二进制文件的操作

字符串流

C++工具

异常处理

所谓异常处理指的是对运行时出现的差错以及其他例外情况的处理。

方法:检查(try)、抛出(throw)和捕捉(catch)

在函数声明中进行异常情况指定

析构函数:若try块中定义了对象,而throw又抛出了异常,此时需要结束本层而返回,本层的对象也要被清理,执行析构函数,然后匹配到catch执行语句。

命名空间

由来:引用不同文件,如果不同的文件中有相同的名称,编译会出错。

命名空间:一个由程序设计者命名的内存区域。程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来

关键字:namespace

namespace ls1 { //命名空间成员
  int a,
  double b;
  class lins{

  };
} //注意后面没有分号
ls1::a; //访问

使用命名空间解决名字冲突

使用命名空间成员的方法

标准命名空间std

上一篇 下一篇

猜你喜欢

热点阅读