目录

C++面向对象复习笔记2021

简单的复习了C++面向对象的部分知识,并把一些遇到的需要回顾的知识点记录到该笔记。

IO Stream

用提取运算符>>提取数据时,以空白符(如空格、回车、tab)作为数据的分割符,因此提取字符串数据时,不能提取空白字符。如果要每次读入一行,可以用getline

1
2
3
4
5
6
7
8
9
ifstream myFile;
myFile.open("in");
string str;
while (!myFile.eof())
{
    getline(myFile, str);
    cout << str << endl;
}
myFile.close();

判断打开的文件是否存在,可以调用成员函数is_open()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
ifstream myFile;
myFile.open("in2");
string str;
if(myFile.is_open()){
    while (!myFile.eof())
    {
        getline(myFile, str);
        cout << str << endl;
    }
}else{
    puts("Not exists. ");
}
myFile.close();

STL

Vector

与C数组对比:

  • 常被称为“动态数组”,因为其大小可以按照需要增长和收缩
  • 有内置的操作元素的成员函数

常用成员函数:

  • push_back()
  • size()
  • pop_back()
  • clear()
  • empty()
  • capacity()
  • reverse()
  • resize()

迭代器

要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。

1
2
3
4
5
for (vector<int>::iterator iter = list.begin(); iter != list.end(); iter++)
{
    cout << *iter << ' ';
}
cout << endl;

Class

访问限定符

  • public:完全可访问
  • private:仅该类可以访问
  • protected:仅该类的成员函数和其派生子类的成员函数可以访问

static

静态成员变量

静态成员变量无需对象实例而存在,且一个类的所有对象共享这个类的相同的静态成员变量,即可以理解为每个对象都有该变量的相同的副本。

注意:为了使静态成员变量有意义,必须在定义类时对其赋初值。(在.cpp文件的顶部)

静态成员函数

静态成员函数属于这个类的所有实例,并能被该类的任何一个对象调用。

静态成员函数只能访问静态成员变量、静态成员函数和类以外的数据和函数。

多态(Polymorphism)

成员函数:通过基类指针或引用间接指向派生类子类型时多态性才会起作用。

析构:如果一个类用作基类,我们通常需要virtual来修饰它的析构函数,这点很重要。如果基类的析构函数不是虚析构,当我们用delete来释放基类指针(它其实指向的是派生类的对象实例)占用的内存的时候,只有基类的析构函数被调用,而派生类的析构函数不会被调用,这就可能引起内存泄露。如果基类的析构函数是虚析构,那么在delete基类指针时,继承树上的析构函数会被自低向上依次调用,即最底层派生类的析构函数会被首先调用,然后一层一层向上直到该指针声明的类型。1

纯虚函数:只有声明没有定义的虚函数,提供了一个可被子类型改写的接口:

1
2
3
4
class Base {
    public:
    virtual int func() = 0;
};

含有一个或多个纯虚函数的类为抽象类,抽象类本身不能产生对象实例,否则代码将不能编译。

参考资料


  1. C++ Virtual详解.悦峰 ↩︎