复习C++&笔记

类与对象

  • 1、静态成员函数没有this指针,静态成员变量可以通过classname::或object.调用,声明非常量静态成员时,需要在类中加static前缀但不能定义或初始化,在类外定义和初始化但不能再加static前缀(不方便编译器判断这是全局静态变量或属于某一个类)。
  • 2、类中函数参数表后加const则函数不能修改类的数据成员。
  • 3、友元函数都在类外定义,不能加上classname::前缀。友元函数没有this指针,可以访问类中的所有数据成员。
  • 4、this指针只在成员函数里有定义,创建一个对象后不能直接取得this指针的位置。
  • 5、构造函数可以有参数,析构函数没有参数,他们都没有返回值。
  • 6、struct和class和union都可以用来定义对象,但struct默认全部公有,class默认全部私有。union不支持继承,默认全部成员公有,union实际只能存放一个成员变量,但可以作为其中包含的任意一种变量被使用,union所占的内存空间也由其中占空间最大的类型决定,union也可以拥有成员函数(union一般用的比较少,仅供了解)。

虚函数与虚继承

  • 7、类的虚继承指继承的方式,虚基类是相对于继承的类来说的(而不是基类的属性)。虚基类解决了多继承中父类存在多个共同基类实例的问题(非虚继承的情况下,如B、C继承A,D继承B、C,则D型对象继承了B-A和C-A两个不同的基类),从而共享A的数据成员。
  • 8、当继承关系满足:基类A-基类B(虚继承基类A)-派生类C。派生类的构造函数的执行顺序:基类A、基类B、对象成员、派生类。通常在多继承中会出现多个基类B虚继承基类A,基类A的构造函数首先被调用,基类B不调用A类的构造函数。
  • 9、虚函数用法
#include <iostream>
using namespace std;
//一个计算几何体周长体积的程序
class Circle{
public://我差点没写?私有构造函数海星
    Circle(double radiu){
        radius=radiu;
    }
    virtual double area(){
        return 3.14*radius*radius;
    };
    virtual double volume(){
        return 0;
    };
protected://这里声明为protected,如果是private,重载的虚函数不能使用这些数据成员
    double radius;
};

class Sphere:public Circle{//这里一定要声明public,否则默认private,基类指针访问不了子类的继承的数据成员
public:
    Sphere(double radius):Circle(radius){
        
    }
    double volume(){
        return 100+4/3.0*3.14*radius*radius*radius;
    }
    double area(){
        return 200+4*3.14*radius*radius;
    }
};
class Column:public Circle{
public:
    Column(double radius, double heigh):Circle(radius),height(heigh){
        
    }
    double volume(){
        return 300+3.14*radius*radius*height;
    }
    double area(){
        return 400+3.14*radius*radius*2+2*3.14*radius*height;
    }
private:
    double height;
};

int main(){
    Sphere ball(1);
    cout<<ball.area()<<endl<<ball.volume()<<endl;
    Column col(1,1);
    cout<<col.area()<<endl<<col.volume()<<endl;
    Circle* ptr;//多态通过基类指针的移动实现
    ptr=&ball;
    cout<<ptr->area()<<endl<<ptr->volume()<<endl;
    ptr=&col;
    cout<<ptr->area()<<endl<<ptr->volume()<<endl;
    return 0;
}
#include <iostream>
using namespace std;

class teacher{
public:
    teacher(double pe){
        peroids=pe;
    }
    virtual int total(){
        return 0;
    }
protected:
    int peroids;
};

class pro:public teacher{
public:
    pro(double pe):teacher(pe){
        
    }
    int total(){
        return 5000+50*peroids;
    }
};

class proAssistant:public teacher{
public:
    proAssistant(double pe):teacher(pe){
        
    }
    int total(){
        return 3000+30*peroids;
    }
};

class lecture:public teacher{
public:
    lecture(double pe):teacher(pe){}
    int total(){
        return 2000+20*peroids;
    }
};

int main(){
    teacher* ptr;
    pro a(10);
    proAssistant b(10);
    lecture c(10);
    ptr=&a;
    cout<<ptr->total()<<endl;
    ptr=&b;
    cout<<ptr->total()<<endl;
    ptr=&c;
    cout<<ptr->total()<<endl;
    return 0;
}

流对象

  • 10、常见的文件打开模式:ios::in 打开并读取, ios::out 打开以写入, ios::trunc 覆盖模式, ios::ate 读文件指针位于文件末尾。如果需要创建新文件,可以用out,也可以用in、out、app的组合。文件打开模式组合较多,详情见相关网站。
  • 11、关于流的方向:in和out是相对于与流操作的对象来说的,比如cin>>a,cin将键盘输入传给a,也就是a的in(输入);cout<<a时a的内容传给cout进而传给显示器,a的内容out(输出)了;文件对象同上,in模式文件对象fs使用>>运算符,将fs的内容传给右边的对象。运算符总能表示流的方向。