C++ 大学课堂知识点总结

一、从C到C++
1.引用
int b;
int &a = b;//a是引用类型       定义的时候加&  表示引用   其余都是取地址 
a是b别名 使用a和使用b是一样的  主要用于函数传参
引用和指针的区别:
引用 相当于外号  不占内存   引用是常量   定义的时候就一定要赋值   不能修改指向
指针  指针变量  存放的是地址  占内存  定义的时候并需要赋值
引用 主要在函数传递参数  提高效率  效率高于指针
int &a = b;//定义的时候  是引用
&a;//取地址
C++也有指针
2.函数部分
 函数 作用 : 代码封装-->减少重复代码     划分模块 便于维护
 函数调用的时候-->函数跳转(需要时间)
 2.1内联
  关键字  inline    内联函数-->    #define  M(a, b) ((a)+(b))
  内联和带参宏定义相似   通过代码复制(浪费内存)   减少函数跳转所需要的时间   空间膨胀换时间
  内联  函数  用起来和函数一样   适用于短的函数  并且常用的函数
  长的函数  循环  函数调用 不适用于内联
  带参宏定义什么时候用 ? -->内联什么时候用
  内联-->替换带参宏定义
  相对于 带参宏定义的好处     参数有类型   不需要考虑优先级  直接当函数使用

 2.2 重载  函数名 相同   参数不一样
  C++允许函数同名   参数不一样(1.参数个数  2.类型)
  a + b-->  int fun(int a, int b)
  double fun2(double a, double b)
   -->int fun(int a, int b)
    double fun(double a, double b);
  一个函数名实现相近多个功能  调用函数的时候通过参数区分
  仅返回值不同不构成重载
  计算机通过参数类型区分调用哪个函数

 2.3 缺省
  定义函数的时候给参数设定默认值   调用函数的时候 这个参数可以省略
  函数定义的时候能不能缺省 ? 能
  函数定义的时候在参数里面写
  如果函数有声明 有定义   只需在声明中缺省
  缺省  只能从右往左缺省(允许全部缺省)
  -->重载和缺省    二义性问题
  调用的时候 不确定调用哪个函数-->二义性(重载和缺省同时使用的时候)
4.new delete
 -->new 申请 内存   malloc
 --->delete 释放内存   free
 申请10个int大小的空间
  int *p = (int*)malloc(sizeof(int)* 10);//C语言
  free(p);//C语言的内存释放
  int *p = new int[10];//C++的内存申请   10个int  
  delete[] p;//释放内存  []放delete后面  []里面不需要加数字   delete[]  p;
  int *q = new int;//申请一个int
  delete q;//释放内存
  int m = 10;
  int *p = new int[m];//申请的时候[]里面的数字是多少个变量   m个int的大小的空间 
  struct node{};
  struct node*p = new node;//申请内存
5.简单的输入输出
 cin   cout     输入输出   endl   换行
 cin >>
 cout <<
 cin >> 不需要加取地址
C++兼容C   然后C语言不能使用C++的
二、面向对象
1.面向对象的思想
 面向过程   1.创建界面  2.生成地图  3.贴图 4.用户点击 5.判断
 以函数为中心
 面向对象  用对象描述-->对象-->数据为核心
 抽象  封装  继承  多态
2.类和对象
 C语言 结构体
 struct student
 { 
  //成员变量
 };
 C++的类
 class student
 {
  //成员变量
  //成员函数
 };
 对象用.对象指针 ->
 对象(数据 行为 保密的)--->   权限问题
 public  公有 外部可以直接访问  所有人都可以用
 private  私有  类的内部进行访问  但是外部不能访问
 protected 受保护的  和私有类似
 类中的成员变量 成员函数 默认私有
 数据方面 一般写成私有   函数 公有
 成员函数中都有一个this指针(和普通函数区别)  指针指向当前对象
 区分参数和成员(如果参数名和成员名不一样  那么可以省略this指针)
 //成员变量 私有  -->在外部调用公有的成员函数给成员变量赋值
 类的成员函数并不是一定要在类里面定义 可以在类外定义 在类里面声明
3.类和结构体的区别和联系
 C++ 的结构体中可以有成员函数(C语言结构体不行) private / protected / public   C++结构体定义变量的时候不需要加struct关键字
 struct student pointer;
 C++类
 区别  结构体成员默认公有    类的成员默认私有
 结构体 一般只用来存放数据   类中有函数
 理解类的本质-->结构体 公有的类   类就是私有的结构体
 C++结构体中也可以写函数
 对象大小只和成员变量的大小有关
三、构造析构拷贝
1.构造函数
 函数给对象成员初始化-->构造函数(构造器)
 构造函数 1.和类名相同 2.没有返回值类型  也没有返回值  3.调用构造的方式 对象出生自动调用(只会调用一次)
 类中成员 没办法在类外访问->使用的时候赋默认值 初始化
 函数名和参数-->重载 缺省
2.析构函数
 析构函数   释放资源(比如说类中的指针 申请内存  交给析构释放_)
 析构函数名   ~类名  没有返回值类型, 没有参数 自动调用(对象销毁的时候调用)
 系统提供的默认构造(没有参数)和析构(不会做任何事情)
3.new delete     malloc free
 new 调用构造  malloc不会
 delete 调用析构  free不会
 delete[] 调用所有对象的析构函数
4.const成员和初始化形参列表-->给变量赋值
 const  常属性     只能通过初始化形参列表赋值
 初始化形参列表的写法
 初始化形参列表可以给const成员赋值 也可以给普通成员变量赋值
5.static 成员
 不属于某个对象  属于整个类
 这个类的所有对象共用static属性成员
 类--> class --->定义的变量叫做对象  作用域:全局
 * 设定初值  类外赋值
6.拷贝构造
 1.类-->提供4个默认函数
 默认构造函数(没有参数的构造函数)
 析构函数
 拷贝构造
 赋值函数
 拷贝构造  特殊的构造函数-->参数只有一个  是这个类类型的参数
 *调用时机    1)定义对象的时候    A a(A类型的对象)
    2)定义对象的时候  用 = 初始化   A  a = A类型的对象;
    3)隐性调用   传递参数  形参拷贝实参
 注意的点 : 1.参数必须为引用类型    (如果不使用引用  那么传参的过程会调用拷贝构造)
     2.拷贝构造中  单独申请内存-->深拷贝
     没有单独申请内存-->浅拷贝
     浅拷贝-->两个指针指向同一个区域  释放内存会出问题
     默认的拷贝构造是浅拷贝
     对象传递参数  引用  没有新的对象产生
     没有写引用   有一个临时对象
     对象 一般传参都会传递引用
 2.const成员(成员变量 / 成员函数)
    const   常属性  const int x定义必须赋初值  赋值之后不能修改
   类中的const成员变量  赋值初始化形参列表赋值
    const成员函数  在成员函数后面加const 里面不能修改类成员变量的值
   不能调用其他非const成员函数
    const加在函数前面 修饰返回值类型
    const加在函数的括号里面  修饰 参数类型
    引用 提高效率  可以在函数中通过引用修改实参的值
    传递const引用 可以避免在函数修改实参的值
    --> const int*和 int*const
     const int*p   常量指针   *p的值不可以修改但指向可改变//int const *p
    int*const q    指针常量   q的值能修改但q不能改指向
  3.static成员(成员变量 / 成员函数)
    1)修饰全局变量   不能在外部文件访问(extern指明访问访问其他cpp的变量)
    2)修饰函数里面的变量  只会定义一次(静态存储区 函数调用结束先不释放)
    3)修饰成员变量   static成员变量  不属于单个对象 属于整个类(赋初值  要在类外赋初值)
    4)修饰成员函数  也是属于这个类     只能修改静态成员
    (static修饰成员函数  没有this指针)
四、运算符重载
 1.友元
  数据--->私有   不能在类外访问  安全性
  访问里面数据的时候-->通过函数访问      速度慢
  针对常用的,需要使用类中私有成员的函数-->友元
  友元  可以访问类中 的私有成员
  friend 关键字  放在函数前面-->破坏数据封装性
  类中成员   私有成员-->只能类中成员函数  友元函数访问
  公有成员-->所有函数都能访问
  友元函数  是类的成员函数么 ? 不是
  友元的优缺点
  友元 外部访问私有成员的机制
  通过成员函数访问私有成员-->友元提高 运行效率
  缺点 破坏数据的封装性 导致程序的可维护性变差
  友元函数:将一个函数声明成一个类的友元   这个函数可以访问类的私有成员
  友元类:将一个类A声明成另外一个类B的友元   这个A中所有成员函数可以访问类B的私有成员
   A是B的朋友  B是不是A的朋友 ?              不是
    我把你当朋友  你把我当(...自行脑补)
   A是B的朋友  B是C的朋友   A是不是C的朋友 ? 不是
    ---> 友元类 不能传递
  类的私有属性-->类中成员的访问方式
  私有成员不能在类外访问  不影响友元
  友元的声明和定义可以放在类中的任何位置
  关于  友元类使用   一般不会用到
  类中的函数  声明成另外一个类的友元
 


 2.运算符重载
  运算符  基本数据类型使用运算符-->在自己定义的对象之间使用运算符
   PS:运算符重载不是一定要写  写了之后可以实现在自己的对象之间使用运算符操作
  不能重载的运算符 .  ::   .*  sizeof  三目运算符
  访问对象中的数据 1.成员函数  2.友元函数  --->a + b
  operator运算符(参数)
  运算符重载 函数参数个数必须和操作数个数一致
  函数的实现 不要违反运算规则
  优先级问题:重载时候不要改变优先级顺序
  不可以创造新的运算符
  单目--->推荐成员函数
  双目-->推荐写友元函数  两个参数可以交换顺序
  (1)算数运算符 + -*/ %
  (2)关系运算符 == != >  < >= <= 双目运算符
  (3)逻辑运算符 && || !
  (4)自增 自减(前++  后++)
  (5)位运算符
  (6)赋值运算符 += -= (= 额外讲)
  (7) ()[] * &  ->
   ()-->   A  a;   a();//调用的重载()运算符     函数调用 函数名(参数)
    重载()的目的  让这个对象更像函数       仿函数  对象-->模仿函数
     仿函数--->实现方式 运算符重载  重载()
     对象名(参数)  仿函数   调用方式和函数形式一样
     1)仿函数 参数  仿函数 返回值
      构造  在对象出生时调用   只会调用
      仿函数 在对象出生之后调用  想调用几次就调用几次
      //   返回值类型   operator() (参数)
      回调函数-->仿函数
      []-->       string-->里面存了字符串   string  st("hello");  假装是数组  char*
      -->st[3]-->'l'
      重载[]   对象中放数组 / 指针(申请动态数组)  int数组
 
      *   里面有指针
      &   返回某个成员的地址
      ->  里面有结构体 / 对象  成员   返回结构体 / 对象的地址  struct
  (8)new delete
   new运算符  三个操作
   1)operator new   (可以重载的部分)主要作用 分配内存
   2)调用构造函数
   3)返回一个指针
   delete 两个操作
   1)调用析构
   2)释放内存  operator delete (可以重载的部分)
   operator new    成员函数  分配内存 new  调用的时机还没有对象  只能static  全局   不能成员(想想前面讲到的static)
  *  operator new() 和 operator delete() 是隐式的static成员。因此,它们无法使用this指针,也不能修改对象的值。一般不建议改写。
  1 #include<iostream>
  2 using namespace std;
  3 class String
  4 {
  5 private:
  6     char* m_data;
  7     size_t length;
  8 public:
  9     //构造函数
 10     String(const char *str=NULL)
 11     {
 12         if (str == NULL)
 13         {
 14             length = 0;
 15             m_data = new char[1];
 16             *m_data = '\0';
 17         }
 18         else
 19         {
 20             length = strlen(str);
 21             m_data = new char[length + 1];
 22             strcpy(m_data, str);
 23         }
 24     }
 25     //构析函数
 26     ~String()
 27     {
 28         delete[] m_data;
 29         length = 0;
 30     }
 31     //拷贝构造
 32     String(const String &other)
 33     {
 34         length = strlen(other.m_data);
 35         m_data = new char[length + 1];
 36         strcpy(m_data, other.m_data);
 37     }
 38 
 39     //获取字符串长度
 40     size_t size()const
 41     {
 42         return length;
 43     }
 44 
 45     //  [] 重载
 46     char& operator[](int n)const
 47     {
 48         if (n >= length)
 49             return m_data[length - 1];
 50         else 
 51             return m_data[n];
 52     }
 53     //  =  重载
 54     String& operator=(const String &other)
 55     {
 56         if (this == &other)
 57             return *this;
 58         if (m_data)
 59             delete[] m_data;
 60         length = strlen(other.m_data);
 61         m_data = new char[length + 1];
 62         strcpy(m_data, other.m_data);
 63         return *this;
 64     }
 65     //  + 重载
 66     String operator+(const String& str)const
 67     {
 68         String newstr;
 69         newstr.length = length + str.size();
 70         newstr.m_data = new char[newstr.length + 1];
 71         strcpy(newstr.m_data, m_data);
 72         strcat(newstr.m_data, str.m_data);
 73         return newstr;
 74     }
 75     //  += 重载
 76     String& operator+=(const String& str)
 77     {
 78         length += str.length;
 79         char* newdata = new char[length + 1];
 80         strcpy(newdata, m_data);
 81         strcat(newdata, str.m_data);
 82         delete[] m_data;
 83         m_data = newdata;
 84         return *this;
 85     }
 86     //  == 重载
 87     bool operator==(const String& str)const
 88     {
 89         if (length != str.length)
 90             return false;
 91         return strcmp(m_data, str.m_data) ? false : true;
 92     }
 93     //  >> 重载
 94     friend istream& operator>>(istream& is, String& str)
 95     {
 96         is >> str.m_data;
 97         return is;
 98     }
 99     //  << 重载
100     friend ostream& operator<<(ostream& os, String& str)
101     {
102         os << str.m_data;
103         return os;
104     }
105     //  <  重载
106     friend bool operator <(const String& s1, const String& s2)
107     {
108         if (strcmp(s1.m_data, s2.m_data) < 0)
109             return true;
110         return false;
111     }
112     //  >  重载
113     friend bool operator >(const String& s1, const String& s2)
114     {
115         if (strcmp(s1.m_data, s2.m_data) > 0)
116             return true;
117         return false;
118     }
119 
120 };
121 
122 class A
123 {
124     int x,*y;
125     A *p;
126 public:
127     A(int m)
128     {
129         x = m;
130         y = &x;
131     }
132     A(const A&other)
133     {
134 
135     }
136     ~A()
137     {
138         
139     }
140 
141     A& operator&(A&other)
142     {
143         this->y = &other.x;
144         return *this;
145     }
146     friend A operator*(A&other)
147     {
148         return *(other.y);
149     }
150     A* operator->()
151     {
152         return p;
153     }
154     friend ostream&operator<<(ostream&os, A&other)
155     {
156         int q = *other.y;
157         os << q;
158         return os;
159     }
160 };
161 int main()
162 {
163     String str1("hello"),str2("world");
164     cout << str1 << endl << str2 << endl << str1 + str2 << endl;
165     str1 += str2;
166     cout << str1 << endl;
167     A a(1),b(2),c(3);
168     int x;
169     cout << (a&b) << endl << (*c=a) << endl;
170     return 0;
171 }
View Code

 

五、继承
 继承  从已有类中加上属性(成员变量)和方法(成员函数)定义一个新的类型
 已有类  基类 / 父类          新的类   派生类 / 子类
 父类派生子类   子类继承父类
 1.继承   子类得到父类的所有成员和所有函数(不包括构造和析构)
 2.调整
  2.1访问控制
   父类的成员访问权限   public          private   protected
   继承方式
   public    public                    不可访问   protected
   private    private       不可访问      private
   protected    protected      不可访问      protected
                                                      (子类成员的访问权限)
   继承方式  默认私有
 

 

   父类 成员属性--->继承方式不同--->继承到子类中 在子类中的表现不一样
     父类的私有成员在子类中不能访问
   子类继承过来的父类的成员函数去访问
   protected 子类继承过来可以访问
   private 子类继承过来不能访问
  2.2  隐藏  子类存在和父类的同名的成员(变量/函数)  子类优先使用子类的成员
   父类的成员得到隐藏
   想要访问父类的同名函数  用类名
  2.3 添加新成员 子类   添加新功能 添加新成员变量/成员函数--->实现新的功能
 
 3.多继承   多个父类派生一个子类(C++有 其他语言没有)
 多继承怎么写
 子类拥有所有父类中所有的成员
 4.关于多继承中
  多个父类有同名成员变量   成员函数(参数)
  子类中新定义的成员和父类成员同名(隐藏)
 5.菱形继承问题
  A派生B和C   B和C共同派生D   D有两份来自爷爷中的成员
  解决菱形继承方法-->虚继承   virtual
  //解决方案 让B和C  虚继承A(两个子类都要virtual)
  //实现的机制
  孙子类  就一份来自祖父类的拷贝
  菱形继承--->影响的是哪个类  孙子类
  虚继承--->解决菱形继承的问题---->孙子类
  虚继承需要写在father中
  A(x, y)-->B(A(x1, y1), z)   C(A(x2, y2), z)
  B + C---->D(B(A(x, y), z), C(A(x, y), z), z) 菱形继承
 
  虚继承-->D(B(z), C(z), A(x, y), z)//  B::z   C::z  z
  PS:这里还涉及到一个知道点----偏移量,有兴趣先自己去了解,暂时不做讲解
 1 #include<iostream>
 2 using namespace std;
 3 
 4 class people
 5 {
 6 protected:
 7     int age;
 8     int height;
 9     int ID;
10     char name[20];
11 public:
12     people(){ cout << "调用people构造函数" << endl; }
13     ~people(){ cout << "调用people构析" << endl; }
14 };
15 class man :virtual public people
16 {
17 protected:
18     char sex;
19     int num;
20 public:
21     man(){ cout << "调用man构造函数" << endl; }
22     ~man(){ cout << "调用man构析" << endl; }
23 };
24 class student :virtual public people
25 {
26 protected:
27     int num;
28     int stuID;
29 public:
30     student(){ cout << "调用student构造" << endl; }
31     ~student(){ cout << "调用student构析" << endl; }
32 };
33 
34 class maleStu :public man, public student
35 {
36     int num;
37 public:
38     maleStu(){ cout << "调用maleStu构造" << endl; }
39     ~maleStu(){ cout << "调用maleStu构析" << endl; }
40     void fun()
41     {
42 
43     }
44 
45 };
46 
47 class maleStu1 :public student, public man
48 {
49     int num;
50 public:
51     maleStu1(){ cout << "调用maleStu构造" << endl; }
52     ~maleStu1(){ cout << "调用maleStu构析" << endl; }
53     void fun()
54     {
55 
56     }
57 
58 };
59 
60 int main()
61 {
62     {
63         maleStu a;
64         a.fun();
65     }
66     cout << endl;
67     {
68         maleStu1 b;
69         b.fun();
70     }
71 
72     cin.get();
73     return 0;
74 }
75 
76 /*
77     结果:
78         多继承中 父类构造函数按照继承顺序进行调用在前的先调用在后的后调用
79         虚继承中 孙子类的构造函数调用父类和爷爷类的构造函数 顺序 爷爷类->父类1->父类2->...->孙子类
80 
81 */
View Code

 

六、多态
  多态  一种形式 多种状态
  想想USB接口   每种线功能不一样-->多态
  父类的指针 可以指向子类对象  什么类的指针 调用什么类的函数
  一个基本保证:一个指针永远不应指向这样的对象——不能提供指针所承诺的最基本的属性
  目的  通过父类的指针调用子类的函数  实现方式:虚函数
  virtual 虚函数  在父类的函数名前面加上virtual  子类中重写父类的虚函数(函数名相同 参数一样)
  覆盖  子类重写父类的虚函数 父类的函数得到覆盖(用父类指针调用  调用的也是子类函数)
  隐藏  子类重写父类的函数   父类的函数得到隐藏
  虚函数-->根据对象决定调用什么函数
  父类 虚函数-->没必要写 父类虚函数  不写实现 直接函数后面写上 = 0   纯虚函数
   //virtual void eat() = 0;// 纯虚函数
  *一个有纯虚函数的类(虚类 / 抽象类 / 接口类) 没办法定义对象 只能定义指针
  *如果子类继承了父类的纯虚函数  然后没有实现  那么这个子类也是虚类  不能创建对象
  构造和析构    构造(不用管)
  析构    建议写虚析构
  //知道虚表存在-->多出一个指针大小   //涉及偏移量
  //虚函数    类中定义了新的虚函数   类中会多出来一个指针(虚表指针)
  虚函数访问方式  通过虚表访问
  实现多态的方式   子类通过重写  修改虚表中函数的地址
  father*p = new son-->p能访问到的内容  1.father的成员函数   2.son的成员(继承过去的成员)
  继承-->子类重写父类的函数(成员函数)
  虚函数 1.成员函数
    2.不能是静态成员函数
    3.不能是内联函数(会处理成非内联函数)  inline (PS: 类中实现的成员 默认处理成内联函数)
    4.构造不能为虚函数   析构一般写虚函数
 1 #include<iostream>
 2 using namespace std;
 3 class father
 4 {
 5 protected:
 6     int x;
 7 public:
 8     father();
 9     virtual void fun()//虚函数
10     {
11         cout << "父类的函数" << endl;
12     }
13     virtual void eat() = 0;// 纯虚函数
14     virtual ~father(){}
15 
16 };
17 //多个函数
18 
19 father::father()
20 {
21 
22 }
23 
24 class son :public father
25 {
26 public:
27     void fun()
28     {
29         cout << "子类的函数" << endl;
30     }
31     void eat()
32     {
33         //
34     }
35 };
36 class son2 :public father
37 {
38 public:
39     void fun();
40     //{
41     //    cout << "hello world" << endl;
42     //}
43 };
44 void son2::fun()
45 {
46     cout << "hello world" << endl;
47 }
48 void  fun(father *p)//形参是父类指针   实参 是子类对象的地址
49 {
50     p->fun();
51 }
52 int main()
53 {
54     //son ss;
55     //father*p = &ss;
56     //p->fun();
57     //cout << sizeof(ss) << endl;
58     //x.fun();
59     //father fa;
60     son s1;//调用的是子类的构造函数
61     //son2 s2;
62     fun(&s1);
63     //fun(&s2);
64     cout << sizeof(son) << endl;
65     father *p= new son;//调用的是 子类的构造函数
66     delete p;//调用什么的析构函数 析构函数写成虚函数
67 
68 
69 
70 
71     cin.get();
72     return 0;
73 }
View Code

 

七、I/O流
 cin / cout   输入输出流
 文件流
 ifstream  输入文件流  从文件中读取内容
 ofstream 输出文件流  输出内容到文件
 fstream 文件流   可以输入可以输出*
 字符流   当作字符处理   txt文本文件  直接打开不会乱码
 字节流  存二进制的方式   直接打开文件  可能会乱码
 C语言   FILE *fp  文件指针和文件操作相关联
 C++文件操作   对象和文件绑定
 成员函数
 open  打开文件 close 关闭
 is_open 判断是否打开成功
 读取和写入
 字符流  get put
 字节流 read  write
 >> 从文件中读取数据 << 写入文件
 文件指针
 输入的文件流指针  seekg  tellg
 输出的文件流指针  seekp   tellp    exe-->文件
 //fstream file;//创建一个文件对象
 //file.open("1.txt", ios::in | ios::out | ios::binary);//打开文件    文件名+打开方式
 //ios::in 读取   ios::out写入  ios::app 追加     ios::binary二进制方式打开
 //file.get(ch);//从文件中读取一个字符
 //file.getline(arr,100); //从文件中读取一行字符
 //file.put(ch);//写入一个字符到文件
 //file.put('h');
 //file.write("hello world", 12);//写入文件   第一个参数char*  第二个参数代表大小
 //file.read(arr, 12);//从文件中读出  第一个参数  读出来之后放的位置   第二个参数 大小
 //file << "hello world";//写入文件
 //file >> arr;//读取文件
 //std::streamoff x = file.tellp();//返回文件指针当前位置距离文件开头的偏移量
 //file.seekp(x, ios::beg);//第一个参数 偏移量 第二个参数 文件相对位置 
 //ios::beg  文件开始   ios::end 文件末尾   ios::cur  文件指针当前位置
 1.输入输出格式控制
  输入 cin
  cin >> x;
  函数名-->cin.get.成员运算符  cin  cout 对象
   int cin.get();//得到一个字符  getchar()
  istream& cin.get(char&ch);
  istream& cin.get(char*arr, streamsize n);//arr是数组名  n是大小
  istream& cin.get(char*arr, streamsize n, char end);//读取到这个end这个字符 提前结束
  cin.getline 读取一行的字符  //读取字符串
  istream& cin.getline(char*arr, streamsize n);//arr是数组名  n是大小
  istream& cin.getline(char*arr, streamsize n, char end);//读取到这个end这个字符 提前结束
  cout
  iomanip头文件
  hex / oct / dec   16进制 / 8进制 / 10进制  默认是10进制    cout << hex << 233 << endl;
 2.精度控制
  setprecision(4)//设置小数的位数
  setiosflags(ios::fixed);//固定小数位
  cout << setiosflags(ios::fixed) << setprecision(4) << 3.141592654 << endl;
  cout << fixed << setprecision(5) << 3.141592654 << endl;
  //用指数方式   setiosflags(ios::scientific)
 3.宽度控制  左右对齐
  setw(n)  设置宽度 最小输出的位数      set width
  setiosflags(ios::left)//左对齐
  setiosflags(ios::right)//右对齐
  setfill(ch)  设置填充字符
  输入输出缓冲区
  输入 输出
  输入数据之后(炒饭)-->按了回车  进入缓冲区(上菜)---->程序读取缓冲区的内容(夹菜)
  输入10个字符-->读取了5个字符   剩下5个字符留给下一次  输入缓冲区
  回车作为结束-->while ((ch = getchar()) != '\n'&&ch != EOF);//清空缓冲区
 输出缓冲区    有些编译器   输出 不是立刻输出这个内容-->需要刷新缓冲区 fflush
  printf("输入字符");//提示用户输入什么内容
 scanf("%c", &ch);

 1 #include<iostream>
 2 #include<string>
 3 #include<fstream>
 4 using namespace std;
 5 char a[1000000000];
 6 int main()
 7 {
 8     fstream flie;
 9     flie.open("1.txt", ios::in | ios::out|ios::binary);
10     if (!flie.is_open())
11     {
12         cout << "文件打开失败" << endl;
13         return 0;
14     }
15 
16     //string a;
17     //flie >> a;
18     
19     flie.seekp(0, ios::end);
20     streamoff x = flie.tellp();
21     int y = (int)x;
22     flie.seekp(0, ios::beg);
23     flie.read(a, y);
24     for (int i = 0; i < y; i++)
25     {
26         a[i] += 5;
27     }
28     //cout << a;
29     flie.seekp(0,ios::beg);
30     flie.clear();
31     flie.write(a, y);
32     flie.close();
33     return 0;
34 }
简单加密
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
char a[1000000000];
int main()
{
    fstream flie;
    flie.open("1.txt", ios::in | ios::out | ios::binary);
    if (!flie.is_open())
    {
        cout << "文件打开失败" << endl;
        return 0;
    }

    //string a;
    //flie >> a;
    
    flie.seekp(0, ios::end);
    streamoff x = flie.tellp();
    int y = (int)x;
    flie.seekp(0, ios::beg);
    flie.read(a, y);
    for (int i = 0; i < y; i++)
    {
        a[i] -= 5;
    }
    //cout << a;
    flie.seekp(0, ios::beg);
    flie.clear();
    flie.write(a, y);
    flie.close();
    return 0;
}
简单解密
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
int main()
{
    fstream file1,file2,file3;
    string arr1,arr2;
    file1.open("1.txt", ios::in);
    file2.open("2.txt", ios::in);
    file3.open("3.txt", ios::out);
    if (!file1.is_open() && !file2.is_open() && !file3.is_open())
    {
        cout << "文件打开失败" << endl;
        return 0;
    }
    char arr[100];
    file1 >> arr;
    file3 << arr;
    file2 >> arr;
    file3 << arr;
    file1.close();
    file2.close();
    file3.close();
    return 0;
}
View Code


八、异常
 程序执行期间产生的问题--->(代码没问题)

    try  catch throw  三个关键字
  try  尝试
  catch  捕获  异常
  throw 抛出异常
 try尝试运行代码(代码可能出现异常), 如果遇到异常   throw抛出异常   catch去捕获并且处理
 1.如果异常没有处理  -->调用abort()函数  中断程序
 2.throw 可以在任意地方抛出异常
 3.多级异常处理   里面的异常自己不能处理 继续往外丢
 4.catch(...)  表示接受任意类型的异常
 try
  {
   try
   {
    throw "hello";
   }
   catch (int x)
   {
   }
  }
  catch (int x){}
九、模板
 重载-->一个函数名  多个函数
 模板  数组  链表 顺序表
 1.模板分为   函数模板    类模板
 template
 2.函数模板
 add  两个数字相加          针对仅仅是参数类型不同的函数
 使用
 函数模板--->传递实际类型-->模板函数
 3.类模板   主要针对 成员类型不同的类
 使用
 类模板--->传入实际类型--->模板类--->用模板类创建的对象
 需要强调的部分 
  (1)类型必须指明 
  (2)成员函数在类外定义必须单独加上模板头
  (3) 在.h里面写模板类   函数在类外定义  不要放cpp里面  直接放.h里面
十、命名空间
 
 重载时,函数名一样参数也一样会怎么样?   重定义
 该怎么办? 命名空间
 管理  类型或者数据或者函数    的方式
 namespace summer//定义
 {
  //里面写函数或者变量
 }
 使用
 1. using namespace 命名空间的名字;    //最简单   但是不安全  
 后面直接使用函数或者变量
 2.  命名空间名::函数名()    //::域名解析符
  指出使用哪个命名空间的函数     安全 但是最麻烦
 3.  直接using  std::cin;  后面直接使用cin就行    安全  比较简单
 命名空间 可以嵌套
补充:
1.对象什么时候结束生命周期 
 作用域{}   出了作用域,对象结束生命周期
2.析构只释放构造函数中的指针
 一般只用于对象内部指针    
3.返回值为引用  和不为引用的区别   是否返回一个临时对象
 结论 如果要进行连续操作  比如++++++a 返回引用  a = b = c = d = e  返回引用
4.父类构造析构和子类的构造析构一样么??  不一样
 子类需要写自己的构造和析构
    子类调用构造函数的时候 需要先调用父类的构造及函数
    子类调用析构之后  调用父类的析构函数
 如果没有显性调用父类构造  会调用默认父类的构造函数
5.虚继承之后 只有一份拷贝  祖父类成员在孙子类成员中只有一份拷贝

转载于:https://www.cnblogs.com/csu-lmw/p/9215342.html

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++大学教程(目录) 第1章 计算机与C++编程简介-------------------------------------------------1 1.1 简介--------------------------------------------------------------1 1.2 什么是计算机------------------------------------------------------3 1.3 计算机组成--------------------------------------------------------3 1.4 操作系统的变革----------------------------------------------------4 1.5 个人计算、分布式计算与客户/服务器计算-----------------------------4 1.6 机器语言、汇编语言和高级语言--------------------------------------5 1.7 C语言与C++的历史--------------------------------------------------6 1.8 C++标准库---------------------------------------------------------7 1.9 Java、Internet与万维网--------------------------------------------7 1.10 其它高级语言------------------------------------------------------8 1.11 结构化编程--------------------------------------------------------8 1.12 典型C++环境基础---------------------------------------------------8 1.13 C++与本书的一般说明----------------------------------------------10 1.14 C++编程简介------------------------------------------------------11 1.15 简单程序:打印一行文本-------------------------------------------12 1.16 简单程序:两个整数相加-------------------------------------------15 1.17 内存的概念-------------------------------------------------------18 1.18 算术运算---------------------------------------------------------19 1.19 判断:相等与关系运算---------------------------------------------21 1.20 新型头文件与名字空间---------------------------------------------24 1.21 有关对象的思考---------------------------------------------------25 小结------------------------------------------------------------------27 术语------------------------------------------------------------------29 自测练习--------------------------------------------------------------31 自测练习答案----------------------------------------------------------33 练习------------------------------------------------------------------34 第2章 控制结构-----------------------------------------------------------38 2.1 简
第1章 计算机与C++编程简介 1.1 简介 1.2 什么是计算机 1.3 计算机组成 1.4 操作系统的变革 I.5 个人计算、分布式计算与客户/a匠务器计算 l. 6 机器语言、汇编语言和高级语言 1.7 C语言与C++的历史 1.8 C++标准库 1.9 Java、Internet与万维网 1.10 其他高级语言 1.11 结构化编程 1.12 典型C++环境基础 1.13 C++与本书的一般说明 1.14 C++编程简介 1.15 简单程序:打印一行文本 1.16 简单程序:两个整数相加 1.17 内存的概念 1.18 算术运算 1.19 判断:相等与关系运算符 1.20 新型头文件与名字空间 1.21 有关对象的思考 小结 术语 自测练习 自测练习答案 练习 第2章 控制结构 2.1 简介 2.2 算法 2.3 伪代码 2.4 控制结构 2.5 if选择结构 2.6 if/e1se选择结构 2.7 while重复结构 2.8 构造算法:实例研究1(计数器控制重复) 2.9 构造算法与自上而下逐步完善:实例研究2(标记控制重复) 2.10 构造算法与自上而下逐步完善:实例研究3(嵌套控制结构) 2.11 赋值运算符 2.12 自增和自减运算符 2.13 计数器控制循环的要点 2.14 for重复结构 2.15 for结构使用举例 2.16 switch多项选择结构 2.17 do/while重复结构 2.18 break和continue语句 2.19 逻辑运算符 2.20 混淆相等(.==)与赋值(=)运算符 2.21 结构化编程小结 2.22 有关对象的思考:确定问题中的对象 小结 术语 自测练习 自测练习答案 练习 第3章 函数 3.1 简介 3.2 C++程序组件 3.3 数学函数库 3.4 函数 3.5 函数定义 3.6 函数原型 3.7 头文件 3.8 随机数产生器 3.9 案例:机会游戏与enum简介 3.10 存储类 3.11 作用域规则 3.12 递归 3.13 使用递归举例:Fibonacci数列 3.14 递归与迭代 3.15 带空参数表的函数 3.16 内联函数 3.17 引用与引用参数 3.18 默认参数 3.19 一元作用域运算符 3.20 函数重载 3.21 函数模板 3.22 有关对象的思考:确定对象属性 小结 术语 自测练习 自测练习答案 练习 第4章 数组 4.1 简介 4.2 数组 4.3 声明数组 4.4 使用数组的举例 4.5 将数组传递给函数 4.6 排序数组 4.7 实例研究:用数组计算平均值、中数和模 4.8 查找数组:线性查找与折半查找 4.9 多下标数组 4.10 有关对象的思考:确定类的行为 小结 术语 自测练习 自测练习答案 练习 递归练习 第5章 指针与字符串 5.1 简介 5.2 指针变量的声明与初始化 5.3 指针运算符 5.4 按引用调用函数 5.5 指针与常量限定符 5.6 按引用调用的冒泡排序 5.7 指针表达式与指针算法 5.8 指针与数组的关系 5.9 指针数组 5.10 实例研究:洗牌与发牌 5.11 函数指针 5.12 字符与字符串处理简介 5.12.1 字符与字符串基础 5.12.2 字符串处理库的字符串操作函数 5.13 有关对象的思考:对象间的交互 小结 术语 自测练习 自测练习答案 练习 特殊小节:建立自己的计算机 更多的指针练习 字符串操作练习 特殊小节:高级字符串操作练习 复杂字符串操作练习 第6章 类与数据抽象(一) 6.1 简介 6.2 结构定义 6.3 访问结构成员 6.4 用struct实现用户自定义类型Time 6.5 用类实现Time抽象数据类型 6.6 类范围与访问类成员 6.7 接口与实现方法的分离 6.8 控制对成员的访问 6.9 访问函数与工具函数 6.10 初始化类对象:构造函数 6.11 在构造函数中使用默认参数 6.12 使用析构函数 6.13 何时调用构造函数与析构函数 6.14 使用数据成员和成员函数 6.15 微妙的陷阱:返回对Private数据成员的引用 6.16 通过默认的成员复制进行赋值 6.17 软件复用性 6.18 有关对象的思考:编写电梯模拟程序的类 小结 术语 自测练习 自测练习答案 练习 第7章 类与数据抽象(二) 7. 1 简介 7.2 const(常量)对象与const成员函数 7.3 复合:把对象作为类成员 7.4 友元函数与友元类 7.5 使用this指针 7.6 动态内存分配与new和delete运算符 7.7 static类成员 7.8 数据抽象与信息隐藏 7.8.1 范例:数组抽象数据类型 7.8.2 范例:字符串抽象数据类型 7.8.3 范例:队列抽象数据类型 7.9 容器类与迭代 7.10 代理类 7.11 有关对象的思考:在电梯模拟程序中使用复合和动态对象管理 小结 术语 自测练习 自测练习答案 练习 第8章 运算符重载 8.1 简介 8.2 运算符重载的基础 8.3 运算符重载的限制 8.4 用作类成员与友元函数的运算符函数 8.5 重载流插入与流读取运算符 8.6 重载一元运算符 8.7 重载二元运算符 8.8 实例研究:Array类 8.9 类型之间的转换 8.10 实例研究:String类 8.11 重载十十与—— 8.12 实例研究:Date类 小结 术语 自测练习 自测练习答案 练习 第9章 继承 9.1 简介 9.2 继承:基类和派生类 9.3 Protected成员 9.4 把基类指针强制转换为派生类指针 9.5 使用成员函数 9.6 在派生类中重定义基类成员 9.7 Public、Protected和Private继承 9.8 直接基类和间接基类 9.9 在派生类中使用构造函数和析构函数 9.10 将派生类对象隐式转换为基类对象 9.11 关于继承的软件工程 9.12 复合与继承的比较 9.13 对象的“使用”关系和“知道”关系 9.14 实例研究:类Point、CircIe和Cylinder 9.15 多重继承 小结 术语 自测练习 自测练习答案 练习 第10章 虚函数和多态性 10.1 简介 10.2 类型域和switch语句 10.3 虚函数 10.4 抽象基类和具体类 10.5 多态性 10.6 实例研究:利用多态性的工资单系统 10.7 新类和动态关联 10.8 虚析构函数 10.9 实例研究:继承接口和实现 10.10 多态、虚函数和动态关联 小结 术语 自测练习 自测练习答案 练习 第11章 C++输入/输出流 11.1 简介 11.2 流 11.2.1 iosbeam类库的头文件 11.2.2 输入/输出流类和对象 11.3 输出流 11.3.1 流插入运算符 11.3. 2 连续使用流插入/流读取运算符 11.3.3 输出char类型的变量 11.3.4 用成员函数put输出字符和put函数的连续调用 11.4 输入流 11.4.1 流读取运算符 11.4.2 成员函数get和getline 11.4.3 istream类中的其他成员函数(Peek、Putback和ignore) 11.4.4 类型安全的I/0 11.5 成员函数read、gcount和write的无格式输人/输出 11.6 流操纵算子 11.6.1 整数流的基数:流操纵算子dec、oct、hex和setbase 11.6.2 设置浮点数精度(Precision、setprecision) 11.6.3 设置域宽(setw、width) 11.6.4 用户自定义的流操纵算子 11.7 流格式状态 11.7.1 格式状态标志 11.7.2 尾数零和十进制小数点(ios:showpoint) 11.7.3 对齐(ios::left、ios::right、ios::internal) 11.7.4 设置填充字符(fill、setfill) 11.7.5 整数流的基数:(ios::dec、ios::oct、ios::hex、ios::showbase) 11. 7.6 浮点数和科学记数法(ios::scientific、ios::fixed) 11.7.7 大/小写控制(ios:uppercase) 11.7.8 设置及清除格式标志(flags、setiosflags、resetiosflags) 11.8 流错误状态 11.9 把输出流连到输入流上 小结 术语 自测练习 自测练习答案 练习 第12章 模板 12.1 简介 12.2 函数模板 12.3 重载模板函数 12.4 类模板 12.5 类模板与非类型参数 12.6 模板与继承 12.7 模板与友元 12.8 模板与static成员 小结 术语 自测练习 自测练习答案 练习 第13章 异常处理 13.1 简介 13.2 何时使用异常处理 13.3 其他错误处理方法 13.4 C十十异常处理基础:try、throw、catch 13.5 简单异常处理例子:除数为o 13.6 抛出异常 13.7 捕获异常 13.8 再抛出异常 13.9 异常指定 13.10 处理意外异常 13.11 堆栈解退 13.12 构造函数、析构函数与异常处理 13.13 异常与继承 13.14 处理new故障 13.15 auto_ptr类与动态内存分配 13.16 标准库异常层次 小结 术语 自测练习 自测练习答案 练习 第14章 文件处理 14.1 简介 14.2 数据的层次 14.3 文件和流 14.4 建立顺序访问文件 14.5 读取顺序访问文件中的数据 14.6 更新顺序访问文件 14.7 随机访问文件 14.8 建立随机访问文件 14.9 向随机访问文件中随机地写入数据 14.10 从随机访问文件中顺序地读取数据 14.11 实例研究:事务处理程序 14.12 对象的输入/输出 小结 术语 自测练习 自测练习答案 练习 第15章 数据结构 15.1 简介 15.2 自引用类 15.3 动态内存分配 15.4 链表 15.5 堆栈 15.6 队列 15.7 树 小结 术语 自测练习 自测练习答案 练习 特殊小节:建立自己的编译器 第16章 位、字符、字符串和结构 16.1 简介 16.2 结构的定义 16.3 结构的初始化 16.4 函数和结构 16.5 类型定义:typedef 16. 6 范例:高效的洗牌和发牌模拟程序 16.7 位运算符 16.8 位段 16.9 字符处理库 16.10 字符串转换函数 16.11 字符串处理库中的查找函数 16.12 字符串处理库中的内存函数 16.13 字符串处理库中的其他函数 小结 术语 自测练习 自测练习答案 练习 第17章 预处理器 17.1 简介 17.2 预处理指令#include 17.3 预处理指令#define:符号常量 17.4 预处理指令#define:宏 17.5 条件编译 17.6 预处理指令#error和#pragma 17.7 运算符#和## 17.8 行号 17.9 预定义的符号常量 17.10 断言(宏assert) 小结 术语 自测练习 自测练习答案 练习 第18章 C语言遗留代码问题 18.1 简介 18.2 UNIX和DOS系统中的输入/输出重定向 18.3 变长参数表 18.4 使用命令行参数 18.5 对编译多个源文件程序的说明 18. 6 用edt和atexit终止程序的执行 18.7 volatile类型限定符 18.8 整数和浮点数常量的后缀 18.9 信号处理 18.10 动态内存分配:函数calloc和realloc 18.11 无条件转移:goto语句 18.12 联合体 18.13 连接指定 小结 术语 自测练习 自测练习答案 练习 第19章 string类与字符串流处理 19.1 简介 19.2 string的赋值与连接 19.3 比较string 19.4 子串 19.5 交换string 19.6 string的特性 19.7 寻找string中的字符 19.8 替换string中的字符 19.9 在string中插入字符 19.10 转换成C语言式char 字符串 19.11 迭代器 19.12 字符串流处理 小结 术语 自测练习 自测练习答案 练习 第20章 标准模板库(STL) 20.1 标准模板库(STL)简介 20.1.1 容器简介 20.1.2 迭代器简介 20.1.3 算法简介 20.2 顺序容器 20.2.1 vector顺序容器 20.2.2 1ist顺序容器 20.2.3 deque顺序容器 20.3 关联容器 20.3.1 multiset关联容器 20. 3.2 set关联容器 20.3.3 mdtimap关联容器 20.3.4 map关联容器 20.4 容器适配器 20.4.1 stack适配器 20.4.2 queue适配器 20.4.3 Priority_queue适配器 20.5 算法 20.5.1 fill、fill_n、generate与generate_n 20.5.2 equal、mismatch和1exicographical_compare 20.5.3 remove、remove_if、 remove_copy和remove_copy_if 20.5.4 replace、replace_if、replace_copy和replace_copy_if 20.5.5 数学算法 20.5.6 基本查找与排序算法 20.5.7 swap、iter_swap和swap_ranges 20.5.8 copy—backward、 merge、 unique和reverse 20.5.9 inplace_merge、 unique—copy和reverse—copy 20.5.10 集合操作 20.5.11 1ower—bound、 upper—bound和equal_range 20.5.12 堆排序 20.5.13 min和max 20.5.14 本章未介绍的算法 20.6 bitset类 20.7 函数对象 小结 术语 自测练习 自测练习答案 练习 Internet和World Wide Web中的STL资源 STL文献 第21章 ANSI/ISO C++标准语言补充 21.1 简介 21.2 bool数据类型 21.3 static—cast运算符 21.4 const—cast运算符 21.5 reinterpret—cast运算符 21.6 名字空间 21.7 运行时类型信息(RTTI) 21.8 运算符关键字 21.9 explicit构造函数 21.10 mutable类成员 21.11 类成员指针(.和—>) 21.12 多重继承与virtual基类 21.13 结束语 小结 术语 自测练习 自测练习答案 练习 附录A 运算符的优先级与结台律 附录B ASCII字符集 附录C 数值系统 附录D 有关C++的Internet与Web资源 参考文献 【媒体评论】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值